gpt4 book ai didi

java - 如何配置 quartz 调度程序占用数据库中存储的作业并在服务器重启时执行?

转载 作者:可可西里 更新时间:2023-11-01 08:27:51 27 4
gpt4 key购买 nike

我一直在使用 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 的构造函数,而是使用构建器类 JobBuilderTriggerBuilder 相反。在那里你可以设置 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/

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