【问题标题】:Quartz job scheduler does not stop on DockerQuartz 作业调度程序不会在 Docker 上停止
【发布时间】:2021-12-03 05:15:26
【问题描述】:

我正在创建一个 maven 项目,作为 Elasticsearch 的插件安装。这个插件有 Quartz 调度程序,它实际上工作正常,直到我想停止它。它不会停止。在 Windows 上,它确实停止了。我已将作业实现为 InterruptableJob,当我调用“中断(键)”时,它只返回 false!所以,“deleteJob(key)”肯定不会起作用。有什么想法吗?

这是 InterruptableJob 的代码:

public class ReportJob implements InterruptableJob {


    private ReportService rs = new ReportService();
    boolean stopped = false;

    public void execute(JobExecutionContext context) throws JobExecutionException {
        SchedulerContext schedulerContext = null;
        if(!stopped) {
            try {
                schedulerContext = context.getScheduler().getContext();
                rs.start(schedulerContext);
            } catch (SchedulerException e) {
                e.printStackTrace();
            }
        }
    }

    @Override
    public void interrupt() throws UnableToInterruptJobException {
        System.out.println("**************interrupting**************");
        stopped = true;
    }
}

这是我要中断和删除工作的原因:

System.out.println("interrupt: " + scheduler.interrupt(new JobKey(jobName, JOB_GROUP)));
System.out.println("deleteJob: " + scheduler.deleteJob(new JobKey(jobName, JOB_GROUP)));

【问题讨论】:

    标签: java docker elasticsearch quartz-scheduler scheduler


    【解决方案1】:

    您的 ReportService 是否有可能在后台线程上运行? 在我看来,if(!stopped) 很快就通过了,之后该工作在rs.start(schedulerContext); 中花费了任意时间。没有新的停止评估。让我们将此场景称为 1。

    我可能错了,rs.start() 启动后台线程并很快终止。我们称这个场景为 2。

    对于场景 1:

    可能你想调用类似的东西

    rs.stop()
    

    在你的 interrupt() 方法中。

    对于场景 2:

    您可能需要另一项工作才能再次关闭 ReportService。中断方法根本没有效果。另请注意,JVM 在最后一个线程终止时终止 - 这通常在 Java AWT/Swing 应用程序中不起作用,如果 ReportService 有自己的线程正在运行,它也不起作用。在这种情况下,您需要主动关闭 ReportService 的线程,或者使用System.exit(),这可能不是您想要的。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2018-05-06
      • 1970-01-01
      • 2012-07-16
      • 1970-01-01
      • 2015-05-11
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多