我正在尝试使用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
现在好像起作用了。没有遇到更多的问题。可能是配置问题,因为我已将配置文件移动到/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?或者如何停止排定程序多次执行作业。 有什么建议吗?谢谢,古扬·沙阿。