是否有可能杀死当前正在运行的Quartz Job?

Kat*_*hir 14 quartz-scheduler

我记得我们不能杀死当前正在运行的Quartz Job,但是我们可以中断并在必要时进行布尔检查,无论我们是否需要继续进行后续操作.

即使我们实现InterruptableJob并调用scheduler.interrupt来中断Job,当前执行的作业仍将在服务器中运行.

例如:

  1. 作业通过Hibernate触发了一个命名的SQL查询,这需要很长时间
  2. 已经对第三方服务器进行了呼叫,其中第三方服务器需要很长时间来响应

http://neopatel.blogspot.in/2011/05/quartz-stop-job.html http://forums.terracotta.org/forums/posts/list/3191.page

有人可以纠正我的理解并解释我如何杀死或阻止"当前"执行的工作?

谢谢,凯西尔

小智 8

你可以创建一个名为JobBase的新抽象类,例如实现IJob接口并插入抽象方法: public abstract void ExecuteJob(IJobExecutionContext context);

在JobBase上,您可以像这样实现方法Execute

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();
        }
}
Run Code Online (Sandbox Code Playgroud)

每个Job都将实现JobExecute方法.

  public class TestJob :JobBase
{
    private ILog logger;
    public TeJob(ILog logger):base(logger)
    {
    }

    public override ExecuteJob(IJobExecutionContext context)
    {
    }
}
Run Code Online (Sandbox Code Playgroud)

假设使用一些工厂来创建一个Job

对于停止工作,您将调用方法 scheduler.Interrupt(new JobKey(jobName));


pou*_*sma 4

正如您所说,在quartz 中没有办法“残酷地”中断工作,在JAVA 中也是如此。

您可以将作业的逻辑封装在单独的线程中,并使用 ExecutorService 运行它。

看一下这个例子:/sf/answers/159291751/

假设您的 QuartzJob 是 Test 类,并将您的业务逻辑移至 Task 类中。

希望能帮助到你