Quartz只执行连续的第一个作业

时间:2014-07-17 09:34:40

标签: quartz-scheduler

我们已经在我们的应用程序中使用Quartz调度程序实现了重复任务。用户可以在任何时间开始安排重复任务,甚至从过去开始。例如,我可以安排一个任务从7月1日开始每月运行,即使今天是7月17日。

我希望Quartz能够在过去的时候立即运行第一份工作,以及随后的任何工作。但是,今天我遇到了一个任务没有立即触发的情况。任务安排在7月15日,今天是7月17日。没啥事儿。在我重新启动服务器和代码以安排数据库中的所有任务运行后,确实被触发。为什么会这样?

下面安排任务的代码。请注意,为了使其重复出现,我们只需使用相同的代码重新安排它,以便我们计算另一个日期(但这部分代码对于手头的问题并不重要)。

编辑:只有第一个作业被触发,任何后续作业都没有被触发。如果我尝试使用startNow()而不是startAt(Date),它仍然无法正常工作,没有任何区别。

    JobDetail job = JobBuilder.newJob(ScheduledAppJob.class)
                              .withIdentity(stringId)
                              .build();

    Trigger trigger = TriggerBuilder.newTrigger()
                                    .withIdentity(stringId)
                                    .startAt(date)
                                    .build();

    try
    {
        scheduler.scheduleJob(job, trigger);
        dateFormat = new SimpleDateFormat("dd MMM yyyy, HH:mm:ss");
        String recurringTime = dateFormat.format(date);
        logger.info("Scheduling recurring job for " + recurringTime);
    }
    catch (SchedulerException se)
    {
        se.printStackTrace();
    }

quartz.properties 文件,位于src / main下(即使在教程中建议的WEB-INF和WEB-INF /类中也尝试过,但没有区别);甚至试过20个threadCount,仍然没有区别:

org.quartz.scheduler.instanceName = AppScheduler
org.quartz.threadPool.threadCount = 3
org.quartz.jobStore.class = org.quartz.simpl.RAMJobStore

1 个答案:

答案 0 :(得分:0)

似乎现在正在工作。避风港遇到了更多问题。可能是配置问题,因为我在/src/main/resources中移动了配置文件。 还尝试打开登录以帮助进行调试:

log4j.logger.com.gargoylesoftware.htmlunit=DEBUG

我们还添加了一个JobTriggerListener来帮助处理日志:

private static class JobTriggerListener implements TriggerListener
    {
        private String name;

        public JobTriggerListener(String name)
        {
            this.name = name;
        }

        public String getName()
        {
            return name;
        }

        public void triggerComplete(Trigger trigger, JobExecutionContext context,
                                    Trigger.CompletedExecutionInstruction triggerInstructionCode)
        {

        }

        public void triggerFired(Trigger trigger, JobExecutionContext context)
        {

        }

        public void triggerMisfired(Trigger trigger)
        {
            logger.warn("Trigger misfired for trigger: " + trigger.getKey());
            try
            {
                logger.info("Available threads: " + scheduler.getCurrentlyExecutingJobs());
            }
            catch (SchedulerException ex)
            {
                logger.error("Could not get currently executing jobs.", ex);
            }
        }

        public boolean vetoJobExecution(Trigger trigger, JobExecutionContext context)
        {
            return false;
        }
    }

检查更新的配置文件

#============================================================================
# Configure Main Scheduler Properties
#============================================================================

org.quartz.scheduler.skipUpdateCheck = true
org.quartz.scheduler.instanceName = MyAppScheduler
org.quartz.scheduler.instanceId = AUTO

#============================================================================
# Configure ThreadPool
#============================================================================

org.quartz.threadPool.class = org.quartz.simpl.SimpleThreadPool
org.quartz.threadPool.threadCount = 25
org.quartz.threadPool.threadPriority = 9

#============================================================================
# Configure JobStore
#============================================================================

org.quartz.jobStore.misfireThreshold = 60000
org.quartz.jobStore.class = org.quartz.simpl.RAMJobStore