14

我记得我们不能终止当前正在运行的 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

有人可以纠正我的理解并解释我如何杀死或停止“当前”执行的 Job 吗?

4

3 回答 3

10

您可以创建名为 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();
        }
}

每个 Job 都会实现 JobExecute 方法。

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

    public override ExecuteJob(IJobExecutionContext context)
    {
    }
}

假设使用一些工厂来创建作业

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

于 2014-09-02T11:26:04.667 回答
4

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

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

看看这个例子:https ://stackoverflow.com/a/2275596/1517816

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

希望能帮助到你

于 2012-10-26T07:31:09.323 回答
2

我不知道为什么没有人提到这一点,或者在提出问题时这可能不可用。

调度程序实例有一个称为shutdown 的方法。

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

以上是用来开始工作的

  scheduler.start();

使用标志或其他东西知道何时停止作业运行。然后使用

 scheduler.shutdown();

我如何实现我的要求:

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

其中 jobDetail 和 simpleTrigger 是不言自明的。

希望能帮助到你。:)

于 2015-05-22T10:47:35.450 回答