gpt4 book ai didi

java - 为什么Quartz作业停止触发并且触发器的状态从WAITING变为ERROR?

转载 作者:太空宇宙 更新时间:2023-11-04 13:06:07 26 4
gpt4 key购买 nike

问题描述:

我有一个 Java 服务,它动态创建 Quartz 作业、触发器,并将这些详细信息保存到 Quartz 相关表中。

如果我强行停止tomcat服务器,那么“Qrtz_triggers”的触发状态字段会更改为ERROR。而且它永远不会执行。

如果我将状态更改为 WAITING,那么它就会开始正确执行。

quartz 配置:

<bean id="schedulerFactoryBean" class="org.springframework.scheduling.quartz.SchedulerFactoryBean" lazy-init="false">
<property name="schedulerName" value="IPASScheduler"/>
<property name="autoStartup" value="true" />
<property name="applicationContextSchedulerContextKey" value="applicationContext" />
<property name="waitForJobsToCompleteOnShutdown" value="true" />
<property name="overwriteExistingJobs" value="true" />
<property name="dataSource">
<ref bean="dataSource" />
</property>
<property name="transactionManager">
<ref bean="transactionManager" />
</property>
<property name="jobFactory" ref="jobFactoryBean"/>
<property name="quartzProperties">
<props>
<prop key="org.quartz.jobStore.misfireThreshold">6000000</prop>
<prop key="org.quartz.jobStore.driverDelegateClass">org.quartz.impl.jdbcjobstore.oracle.OracleDelegate</prop>
<prop key="org.quartz.jobStore.isClustered">true</prop>
<prop key="org.quartz.jobStore.clusterCheckinInterval">20000</prop>
<prop key="org.quartz.jobStore.class">org.quartz.impl.jdbcjobstore.JobStoreTX</prop>
<prop key="org.quartz.scheduler.instanceName">IPASClusteredScheduler</prop>
<prop key="org.quartz.scheduler.instanceId">AUTO</prop>
<prop key="org.quartz.scheduler.jmx.export">true</prop>
<prop key="org.quartz.jobStore.selectWithLockSQL">SELECT * FROM QRTZ_LOCKS WHERE LOCK_NAME = ?</prop>
<prop key="org.quartz.threadPool.threadCount">10</prop>
<prop key="org.quartz.threadPool.threadPriority">5</prop>
<!-- <prop key="org.quartz.jobStore.dontSetAutoCommitFalse">true</prop> -->
<!-- <prop key="org.quartz.scheduler.wrapJobExecutionInUserTransaction">false</prop> -->
<!-- <prop key="org.quartz.jobStore.useProperties">false</prop> -->
</props>
</property>
</bean>

用于创建 Quartz Job 和 Quartz Trigger 的 Java 类

//creating Quartz job 
JobDetail job = JobBuilder.newJob(ReportRunnerJob.class).withIdentity(jobName, "MY_REPORTING").build();



//Creating trigger
CronTrigger trigger = TriggerBuilder.newTrigger().withIdentity(triggerName, "MY_REPORTING").withSchedule(CronScheduleBuilder.cronSchedule("0/10 * * * * ?")).withMisfireHandlingInstructionFireAndProceed()).build();

Scheduler scheduler = schedulerFactoryBean.getScheduler();
scheduler.scheduleJob(job, trigger);
scheduler.start();
// Thread.sleep(1000L);
// scheduler.shutdown(true);

工作:

public class ReportRunnerJob implements Job
{
@Autowired
private SessionFactory sessionFactoryReporting;
@Autowired
private JdbcTemplate jdbcTemplateReporting;
@Autowired
private MailService mailService;*/
@Context
private HttpServletRequest request;

public void execute(JobExecutionContext context) throws JobExecutionException {
System.out.println("Schedular job started");
}
}

最佳答案

我建议您为quartz启用DEBUG日志级别。

我怀疑,当你强行停止tomcat时。您的 quartz 触发器尝试加载 ReportRunnerJob 类,在这些停止时刻,它会失败并将触发器状态更新为“错误”

关于java - 为什么Quartz作业停止触发并且触发器的状态从WAITING变为ERROR?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34416678/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com