How to interrupt or stop currently running quartz job?

前端 未结 5 1297
时光取名叫无心
时光取名叫无心 2020-12-10 01:42

I have some tasks that are executed with the help of Java Quartz Jobs, but I need to stop some tasks by some condition in my code. I read that this can be done via Interrupt

相关标签:
5条回答
  • 2020-12-10 02:25

    I don't know why nobody mentioned this, or maybe this was not available at the time the question was asked.

    There is a method called shutdown for a Scheduler instance.

     SchedulerFactory factory = new StdSchedulerFactor();
     Scheduler scheduler = factory.getScheduler();
    

    The above is used to start a job like

     scheduler.start();
    

    Use a flag or something to know when to stop the job from running. Then use

     scheduler.shutdown();
    

    How I implemented my requirement:

    if(flag==true)
        {
            scheduler.start();
            scheduler.scheduleJob(jobDetail, simpleTrigger);
        }
        else if(flag==false)
        {
            scheduler.shutdown();
        }
    

    Where jobDetail and simpleTrigger are self explanatory.

    Hope it helps. :)

    0 讨论(0)
  • 2020-12-10 02:28

    The best solution in my opinion is the one described in this thread: http://forums.terracotta.org/forums/posts/list/7700.page

    I've just introduced a "sleep" after set stop flag to true to allow the job to finish cleanly.

        @Override
    public void interrupt() throws UnableToInterruptJobException {
        stopFlag.set(true);
        try {
            Thread.sleep(30000);
        } catch (InterruptedException e) {
            //logger.error("interrupt()", e);
        }
        Thread thread = runningThread.getAndSet(null);
        if (thread != null)
            thread.interrupt();
    }
    
    0 讨论(0)
  • 2020-12-10 02:29

    In Quartz 2.1 with Spring you can:

    @Autowired
    private Scheduler schedulerFactoryBean; //injected by spring
    ...
    ...
    
    List<JobExecutionContext> currentlyExecuting = schedulerFactoryBean.getCurrentlyExecutingJobs();
    
    //verifying if job is running       
    for (JobExecutionContext jobExecutionContext : currentlyExecuting) {
        if(jobExecutionContext.getJobDetail().getKey().getName().equals("JobKeyNameToInterrupt")){
            result = schedulerFactoryBean.interrupt(jobExecutionContext.getJobDetail().getKey());
        }
    }
    
    0 讨论(0)
  • 2020-12-10 02:30

    Probably a little late to answer this, but may be it can help:

    If you no longer need a job, you can delete that particular job using

    scheduler.deleteJob(jobKey(<JobKey>, <JobGroup>));
    

    This method will only interrupt/stop the job uniquely identified by the Job Key and Group within the scheduler which may have many other jobs running.

    On the other hand if you want to completely shutdown the scheduler and all the jobs therein you can do

    scheduler.shutdown();
    

    This is a pretty nice example of different job related tasks.

    0 讨论(0)
  • 2020-12-10 02:33

    You need to write a your job as an implementation of InterruptableJob. To interrupt this job, you need handle to Scheduler , and call interrupt(jobKey<<job name & job group>>)

    Please have a look @ javadoc for above classes, also quartz distribution contains an example for this (example7).

    0 讨论(0)
提交回复
热议问题