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

标签 java mysql jdbc quartz-scheduler

我一直在使用 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/

相关文章:

java - 兼容 JDBC 的主存独立数据库

java - 我怎样才能使这个线程安全?

java - 如何使用 JAXB (xjc) 为全局元素生成 POJO?

mysql - 内连接与普通表的外左连接

java - H2语句池

java - 从 JDBC 运行 sql 查询

java - 对三个 Activity 使用相同的 sqlite

Java反射,改变父类(super class)中声明的字段的值

mysql - 如何将 WordPress 与本地主机和另一台服务器上预先存在的数据库一起使用

mysql - Play Framework 2.3 - 无法连接到远程数据库 Linux (Play) -> Win 7 (MySQL)