我正在处理与 Quartz 一起安排的服务器作业。目前,我们正在尝试找到一种方法在作业完成时通知用户。我试图使用 JobListener.jobWasExecuted() 方法,但现在似乎在作业完成执行时调用它,但在调用执行方法之后(在它返回之前)。
这是正确的行为还是我做错了什么?
如果关于我如何实现这一目标的任何其他建议,将不胜感激。
提前感谢!
编辑:在进一步查看之后,看起来侦听器在执行方法返回后被调用)对于除了作业的第一个实例之外的所有内容都正常运行(jobWasExecuted()。我们有多个同时运行的同一作业的实例。有什么理由会这样吗?
另一种方法是检查作业当前是否正在运行。您可以使用以下方法来确定作业是否在作业类中运行。
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
我遇到了一些类似的问题。这实际上是由于作业侦听器的 name 属性重复而引发的;这应该是唯一的。
侦听器的 jobWasExecuted() 方法在作业的执行方法完成其工作后被调用。调用层次结构大致是这样的
- Listener->jobToBeExecuted()
- Job->execute()
- Listener->jobWasExecuted()
PS:虽然有点晚了,但可能对某人有帮助.:D
我发现了问题。我开始了一份不属于我正在使用的小组的工作。这导致了一些奇怪的行为。一旦我删除了启动额外工作的行,一切都开始按预期工作