我一直在使用 quartz 调度程序按小时发送大量电子邮件,效果非常好。该调度程序被显式调用一次。当服务器在调度程序执行过程中重新启动时会出现问题。 quartz 调度器虽然在 JOB_DETAILS 表中创建了一条记录,但并没有占用该任务在服务器启动时自动执行。
感谢任何解决此问题的帮助。
这里是示例代码和当前配置。
SchedulerFactory factory = new StdSchedulerFactory();
Scheduler scheduler;
try {
scheduler = factory.getScheduler();
// Creating Job and link to our Job class
JobDetailImpl jobDetail = new JobDetailImpl();
jobDetail.setName(jobName);
jobDetail.setJobClass(HelloJob.class);
int repeat = totalBal/Constants.HOURLY_LIMIT;
System.out.println("totalBal : "+totalBal+ " | "+ "repeat : "+repeat);
// Creating schedule time with trigger
SimpleTriggerImpl simpleTrigger = new SimpleTriggerImpl();
simpleTrigger.setStartTime(new Date(
System.currentTimeMillis() + 1000));
simpleTrigger.setRepeatCount(repeat); // SimpleTrigger.REPEAT_INDEFINITELY
//simpleTrigger.setRepeatInterval(3600000);
simpleTrigger.setRepeatInterval(5000);
simpleTrigger.setName(jobName);
// Start scheduler
System.out.println("Scheduler Started");
scheduler.start();
scheduler.getContext().put("externalInstance", cmpgId);
scheduler.scheduleJob(jobDetail, simpleTrigger);
} catch (SchedulerException e) {
quartz 属性文件
# Configure ThreadPool
org.quartz.threadPool.class = org.quartz.simpl.SimpleThreadPool
org.quartz.threadPool.threadCount = 25
org.quartz.threadPool.threadPriority = 5
# Configure JobStore
org.quartz.jobStore.misfireThreshold = 60000
org.quartz.jobStore.class = org.quartz.impl.jdbcjobstore.JobStoreTX
org.quartz.jobStore.driverDelegateClass = org.quartz.impl.jdbcjobstore.StdJDBCDelegate
#org.quartz.jobStore.useProperties = false
org.quartz.jobStore.dataSource = myDS
org.quartz.jobStore.tablePrefix = QRTZ_
# Configure Datasources
org.quartz.dataSource.myDS.driver = com.mysql.jdbc.Driver
org.quartz.dataSource.myDS.URL = jdbc:mysql://10.10.10.131:3306/abc
org.quartz.dataSource.myDS.user = product
org.quartz.dataSource.myDS.password = product
org.quartz.dataSource.myDS.maxConnections = 5
org.quartz.dataSource.myDS.validationQuery=select 1
网络.xml
...<context-param>
<param-name>quartz:config-file</param-name>
<param-value>quartz.properties</param-value>
</context-param>
<context-param>
<param-name>quartz:shutdown-on-unload</param-name>
<param-value>true</param-value>
</context-param>
<context-param>
<param-name>quartz:wait-on-shutdown</param-name>
<param-value>true</param-value>
</context-param>
<context-param>
<param-name>quartz:start-on-load</param-name>
<param-value>true</param-value>
</context-param>
<servlet>
<servlet-name>QuartzInitializer</servlet-name>
<servlet-class>org.quartz.ee.servlet.QuartzInitializerServlet</servlet-class>
<init-param>
<param-name>shutdown-on-unload</param-name>
<param-value>true</param-value>
</init-param>
<load-on-startup>2</load-on-startup>
</servlet> ....
最佳答案
你不应该使用具体的 JobDetail
/Trigger
的构造函数,而是使用构建器类 JobBuilder
和 TriggerBuilder
相反。在那里你可以设置 reqeustRecovery
属性,其中
[i]nstructs the Scheduler whether or not the Job should be re-executed if a 'recovery' or 'fail-over' situation is encountered
JobDetail job = newJob(MyJob.class)
.withIdentity("myJob")
.requestRecovery(true)
.build();
关于java - 如何配置 quartz 调度程序占用数据库中存储的作业并在服务器重启时执行?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33343597/