当前位置: 首页 > 知识库问答 >
问题:

Quartz不随机执行作业

公西岳
2023-03-14

我正在尝试使用Quartz来调度运行在GlassFish上的web应用程序中的作业。我在用RamjobStore。问题是,有时调度的作业没有被执行,即使它是在过去或将来被调度的。作业数量非常少,排定程序上一直排定的作业总数不到20个,同时保证最多运行1个作业,所以我假设线程计数不是问题,我可以将它设置为ThreadCount1,它仍然可以工作。在servlet被销毁之前,调度程序也不会被关闭。那么,某些作业未运行的原因是什么呢?

启动Servlet

public void init()
    {
  try
        {
            scheduler = StdSchedulerFactory.getDefaultScheduler();
            scheduler.start();
            loadJobs();
        }
        catch (SchedulerException se)
        {
            se.printStackTrace();
        }
}

  @Override
    public void destroy()
    {
 try
        {
            scheduler.shutdown();
        }
        catch (SchedulerException se)
        {
            se.printStackTrace();
        }
    }

安排作业

 JobDetail job = JobBuilder.newJob(ScheduledTransactionJob.class)
                                  .withIdentity(transaction.getId())
                                  .build();

        Trigger trigger = TriggerBuilder.newTrigger()
                                    .withIdentity(transaction.getId())
                                    .startAt(date)
                                    .build();
        try
        {
            scheduler.scheduleJob(job, trigger);
            dateFormat = new SimpleDateFormat("dd MMM yyyy, HH:mm:ss");
            String recurringTransactionTime = dateFormat.format(date);
            logger.info("Scheduled job for " + recurringTransactionTime);
        }
        catch (SchedulerException se)
        {
            se.printStackTrace();
        }

Quartz.Properties

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

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

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

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

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

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

共有1个答案

闻人吕恭
2023-03-14

现在好像起作用了。没有遇到更多的问题。可能是配置问题,因为我已将配置文件移动到/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;
        }
    }
 类似资料:
  • 我有这份工作: 作业应该每小时运行一次。我以为问题是cronexpression。这就是为什么我把它改成上面的表达式。在我有这个表达之前: null

  • 问题内容: 我有一个Java程序,每20秒从Spring Qquartz执行一次。有时只需几秒钟即可执行,但是随着数据变大,我确信它会运行20秒或更长时间。 在一个实例仍在执行时,如何防止Quartz触发/触发作业?发射2个在数据库上执行相同操作的作业效果不佳。有没有办法可以进行某种同步? 问题答案: 如果您需要做的是每20秒发射一次,则Quartz严重过度使用。对于这项工作,应该足够了。 的还提

  • 我正在使用一个石英工作执行特定的任务。 如果另一个Main Job实例仍在运行,我想阻止调度器启动第二个Main Job实例...

  • 我是javascript新手,这可能是一个简单的问题。。。 我在这里所做的是修改div(#box)的css样式,这取决于你所在页面的位置( 我试图实现的是向#box添加多个css更改,并每次执行一个随机更改。例如,每次从最顶端滚动通过200,div的显示高度为:绿色背景为“100px”,蓝色背景为“200px”,或红色背景为“300px”。希望这有意义。。。。

  • 问题内容: 对于我的应用程序,我创建作业并使用CronTriggers计划它们。每个作业只有一个触发器,并且作业名称和触发器名称都相同。没有作业共享触发器。 现在,当我创建像这样的cron触发器 “ 0/1 * * 吗?” 它指示作业每秒钟执行一次,效果很好。 当我第一次通过以下方式暂停工作时,问题就出现了: 然后假设50秒后恢复工作: 我看到的是,在这50秒钟中,作业没有按要求执行。但是当我恢复

  • 如何将CronTimer迭代器设置为1?或者如何停止排定程序多次执行作业。 有什么建议吗?谢谢,古扬·沙阿。