8

给定一个 Quartz 作业和以下命令

boolean deleted = scheduler.deleteJob(event.getName(), "some group name")

假设deleted回来false,据我了解,这意味着从 JVM 的角度来看,工作仍然存在。

带着这2个问题:

  1. 是否可以强制删除作业?
  2. 什么事件阻止 Quartz 删除作业?

如果没有抛出异常,假设没有找到工作是否安全?什么会导致这个?发生这种情况的唯一方法不是首先删除作业吗?

我在用

    <dependency>
        <groupId>org.quartz-scheduler</groupId>
        <artifactId>quartz</artifactId>
        <version>1.8.0</version>
    </dependency>

这让你觉得这是一种正确的处理方式吗?我的推理正确吗?

    boolean deleted;
    try {
        deleted = scheduler.deleteJob(event.getName(), "some group name");
        if (!deleted) {
            logger.warn("Quartz failed to delete the job!" + event.getName() + ". Job not found");
        }
    } catch (SchedulerException e) {
        logger.error("There is an internal Scheduler error", e);
    }
4

2 回答 2

9
  1. 是的,你已经在这样做了。
  2. 作业当前正在运行。

如果您需要在运行时删除作业,请确保您的作业实现 org.quartz.InterruptableJob。然后你可以org.quartz.Scheduler.interrupt(JobKey)在它运行时调用它来停止它。

尝试在 SchedulerException 之后为一般异常添加一个 catch(这是更好的异常处理,如果您不确定可能会遇到的错误,它将对您有所帮助)。

另请记住,当您构建石英作业时,您可以使用jobBuilder.storeDurably(false),这将导致您的石英作业在不再有关联的活动触发器时被自动删除。

于 2013-04-23T17:50:03.700 回答
0

在安排作业时设置以下一个

job.getJobDataMap().put("JOB_NUMBER",input);
            job.getJobDataMap().put("TRIGGER_NAME",input);

在执行作业操作

TriggerKey triggerKey = new TriggerKey(jobCtx.getMergedJobDataMap().get("TRIGGER_NAME").toString(),jobCtx.getMergedJobDataMap().get("TRIGGER_NAME").toString());
//condition
scheduler.unscheduleJob(triggerKey);
scheduler.deleteJob(JobKey.jobKey(jobCtx.getMergedJobDataMap().get("JOB_NUMBER").toString(),jobCtx.getMergedJobDataMap().get("JOB_NUMBER").toString()) );
于 2015-05-06T15:36:58.033 回答