什么时候调用quartz Scheduler JobListener.jobWasExecuted()方法?

时间:2015-01-14 07:20:28

标签: java quartz-scheduler

我正在处理使用Quartz安排的服务器作业。目前,我们正在尝试找到一种在作业完成时通知用户的方法。我试图使用JobListener.jobWasExecuted()方法,但它似乎在作业完成执行时调用,但是在调用execute方法之后(并且在它返回之前)。

这是正确的行为还是我做错了什么?

如果有任何其他建议我如何能够实现这一点,我将不胜感激。

提前致谢!

编辑: 在查看它之后,看起来监听器正在正常运行(一旦execute方法返回就会调用jobWasExecuted())除了第一个作业实例之外的所有实例。我们有几个同时运行的同一个实例。这有什么理由吗?

3 个答案:

答案 0 :(得分:1)

另一种方法是检查作业当前是否正在运行。您可以使用以下方法确定您的工作类别中是否正在运行作业。

private boolean isJobRunning(JobExecutionContext ctx) throws SchedulerException
{
    List<JobExecutionContext> jobs = ctx.getScheduler().getCurrentlyExecutingJobs();

    for (JobExecutionContext job : jobs)
    {
        // check if the current job is already running (make sure to check that fire times are different so that a different
        // instance of the same job is checked)
        if (job.getJobDetail().getJobClass().getName().equals(this.getClass().getName()) && !job.getFireTime().equals(ctx.getFireTime()))
        {
            return true;
        }
    }

    return false;
}

从链接粘贴的副本:http://wordgraphs.com/post/607/Checking-if-a-Quartz-job-is-already-running

答案 1 :(得分:1)

我有点类似的问题。由于作业监听器的名称属性重复,实际上正在提出这个问题;这应该是唯一的。

jobWasExecuted()侦听器的方法在作业的execute方法完成其工作后被调用。大致上,Call层次结构就像这样

  1. Listener-&GT; jobToBeExecuted()
  2. Job-&gt; execute()
  3. Listener-&GT; jobWasExecuted()
  4. PS:虽然有点晚但可能对某人有帮助。:D

答案 2 :(得分:0)

我发现了问题。我开始的工作不是我正在使用的小组的一部分。这引起了一些奇怪的行为。一旦我删除了启动额外工作的行,一切都按预期开始工作