Is it possible to kill a current running Quartz Job?

前端 未结 3 781
梦谈多话
梦谈多话 2021-01-04 05:48

I remember that we cannot kill the current running Quartz Job but we can interrupt and have a boolean check wherever is necessary whether we need to proceed further with the

相关标签:
3条回答
  • 2021-01-04 06:10

    you can create new abstract class called JobBase for example that implements IJob interface and insert abstract method: public abstract void ExecuteJob(IJobExecutionContext context);

    On JobBase you can implements method Execute like this

    public abstract class JobBase : IJob,IInterruptableJob
    {
         private Thread currentThread;
         private ILog logger;
         public JobBase(ILog logger)
         {
            this.logger=logger;
         }
            public void Execute(IJobExecutionContext context)
            {
    
                var thread = new Thread(()=> 
                {
                    try
                    {
                        this.ExecuteJob(context);
                    }
                    catch(Exception ex)
                    {
                        this.logger.ErrorFormat("Unhandled exception {0}",ex.ToString());
    
                    }
                });
    
                thread.Start();
                this.currentThread = thread;
                this.currentThread.Join();  
            }
            public abstract void ExecuteJob(IJobExecutionContext context);
    
            public void Interrupt()
            {   
                currentThread.Abort();
            }
    }
    

    Each Job will implements JobExecute method.

      public class TestJob :JobBase
    {
        private ILog logger;
        public TeJob(ILog logger):base(logger)
        {
        }
    
        public override ExecuteJob(IJobExecutionContext context)
        {
        }
    }
    

    Assumes that use some factory for creating a Job

    For Stopping a Job you will call method scheduler.Interrupt(new JobKey(jobName));

    0 讨论(0)
  • 2021-01-04 06:13

    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)
  • 2021-01-04 06:17

    As you told, there is no way to interrupt "brutally" a job in quartz, neither in JAVA.

    You can encapsulate your job's logic in a separate Thread and run it with the ExecutorService.

    Take a look to this example: https://stackoverflow.com/a/2275596/1517816

    Assume your QuartzJob is the Test class and move your business logic in the Task class.

    Hope it helps

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