spring boot / cloud 使用quartz搭建调度中心
【文章来自:on the way】

quartz介绍:

Quartz是OpenSymphony开源组织在Job scheduling领域又一个开源项目,它可以与J2EE与J2SE应用程序相结合也可以单独使用。Quartz可以用来创建简单或为运行十个,百个,甚至是好几万个Jobs这样复杂的程序。Jobs可以做成标准的Java组件或 EJBs。Quartz的最新版本为Quartz 2.3.0

思路

将quartz集成进spring boot,并且提供一下内容:

配置

样例作业和触发器

实现

1.配置

引入maven依赖(这里的quartz使用的是2.2.3)

<dependency>
  <groupId>org.springframework</groupId>
  <artifactId>spring-context-support</artifactId>
</dependency>

<dependency>
  <groupId>org.quartz-scheduler</groupId>
  <artifactId>quartz</artifactId>
  <version>${quartz.version}</version>
</dependency>

编写AutowiringSpringBeanJobFactory类

public final class AutowiringSpringBeanJobFactory extends SpringBeanJobFactory
    implements ApplicationContextAware {

  /**
   * 描述 : beanFactory
   */
  private AutowireCapableBeanFactory beanFactory;

  @Override
  public void setApplicationContext(final ApplicationContext context) {
    beanFactory = context.getAutowireCapableBeanFactory();
  }

  @Override
  protected Object createJobInstance(final TriggerFiredBundle bundle) throws Exception {
    final Object job = super.createJobInstance(bundle);
    beanFactory.autowireBean(job);
    return job;
  }
}

编写SchedulerConfig类

@Configuration
@ConfigurationProperties(prefix = "com.egridcloud.scheduler.config")
@Validated
public class SchedulerConfig {

..........

}

编写SchedulerConfig类-属性

  //是否记录日志
  @NotNull
  private Boolean logFlag = true;
  //是否记录详细日志
  @NotNull
  private Boolean logDetailFlag = false;
  /是否自动启动
  @NotNull
  private Boolean autoStartup = true;
  //是否覆盖已经存在的jobs
  @NotNull
  private Boolean overwriteExistingJobs = true;
  //延迟启动秒数
  @NotNull
  private Integer startupDelay = 0;
  /Job接受applicationContext的成员变量名
  @NotNull
  private String applicationContextSchedulerContextKey = "applicationContext";
  //quartz配置文件地址
  @NotNull
  private String quartzPropertiesPath = "def_quartz.properties";

编写SchedulerConfig类-编写bean

  @Bean
  public JobFactory jobFactory(ApplicationContext applicationContext) {
    AutowiringSpringBeanJobFactory jobFactory = new AutowiringSpringBeanJobFactory();
    jobFactory.setApplicationContext(applicationContext);
    return jobFactory;
  }

  @Bean
  public Properties quartzProperties() throws IOException {
    PropertiesFactoryBean propertiesFactoryBean = new PropertiesFactoryBean();
    propertiesFactoryBean.setLocation(new ClassPathResource(getQuartzPropertiesPath()));
    propertiesFactoryBean.afterPropertiesSet();
    return propertiesFactoryBean.getObject();
  }

  @Bean("clusterQuartzScheduler")
  public SchedulerFactoryBean schedulerFactoryBean(DataSource dataSource, JobFactory jobFactory,
      Properties quartzProperties)
      throws IOException {
    //实例化
    SchedulerFactoryBean factory = new SchedulerFactoryBean();
    factory.setDataSource(dataSource);
    factory.setJobFactory(jobFactory);
    //属性设置
    factory.setQuartzProperties(quartzProperties);
    factory.setOverwriteExistingJobs(getOverwriteExistingJobs());
    factory.setAutoStartup(getAutoStartup());
    factory.setStartupDelay(getStartupDelay());
    factory.setApplicationContextSchedulerContextKey(getApplicationContextSchedulerContextKey());
    //返回
    return factory;
  }

编写def_quartz.properties配置文件

#Configure scheduler
org.quartz.scheduler.instanceName=clusterQuartzScheduler
org.quartz.scheduler.instanceId=AUTO
org.quartz.scheduler.skipUpdateCheck=true

#Configure ThreadPool
org.quartz.threadPool.class=org.quartz.simpl.SimpleThreadPool
org.quartz.threadPool.threadCount=5
org.quartz.threadPool.threadPriority=5

#Configure JobStore and Cluster
org.quartz.jobStore.class=org.quartz.impl.jdbcjobstore.JobStoreTX
org.quartz.jobStore.driverDelegateClass=org.quartz.impl.jdbcjobstore.StdJDBCDelegate
org.quartz.jobStore.useProperties=true
org.quartz.jobStore.tablePrefix=QRTZ_
org.quartz.jobStore.isClustered=true
org.quartz.jobStore.clusterCheckinInterval=20000
org.quartz.jobStore.misfireThreshold=60000

执行数据库脚本,以及数据库配置(按需,我这里选择的是h2)

tables_h2.sql

########################################################
###DATASOURCE (DataSourceAutoConfiguration & DataSourceProperties)
########################################################
spring.datasource.url=jdbc:h2:file:D:/develop/d2_db/testdb

结束

以上演示了quartz在spring boot中的配置,在下一章里会聊一下通过RMS来实现分布式调度的调度器的设计.

热门文章

新零售如何落地变现?切忌空谈,预测顾客需求是关键
【文章来自:遇见】

新零售概念一定要有助于企业持续改善盈利才有……


让客户满意的战略
【文章来自:江北来客】

09年6月,科罗思集团发布了上海银行业满意度……


“不满意度”怎么管?——答复《那些年,我们丢掉的客户》读者来信
【文章来自:耳朵】

一直以来,天下数据在对待流失客户的问题上……


提高满意度建议
【文章来自:Irene】

任何一家生机勃勃的企业,他们必有一个最大的……


“一次搞定”才是好销售
【文章来自:夏末】

“一次搞定”是一个重要的质量理念,许多专家……


提高客户满意度的四个方法
【文章来自:萱儿】

如何在服务过程中向顾客传递积极有效的信息……


满意度的驱动力——“价值”
【文章来自:名七杀】

在当今市场经济迅速发展的大环境下,一个企业……


满意度如何提高?看这10条就对了
【文章来自:雪儿】

销售不是强制的向客户推销,而是要站在客户的……


如何提高客户服务水平
【文章来自:雨】

营销专家詹姆斯.穆尔说:“现代企业的命运掌……


让顾客满意是我们永恒的追求
【文章来自:Sophie】

所谓众口难调,虽然客户的需求是各种各样……


服务质量对顾客满意度的影响
【文章来自:快乐】

如何在服务过程中向顾客传递积极有效的信息……


提升用户满意度
【文章来自:随风】

思想决定行动”,要想提升自己的客户服务水……


跨平台服务端网络模型对比, IOCP , kqueue , epoll ... 有多重要?
【文章来自:项籍】

设计 mmo 服务器,我听过许多老生常谈……


spring boot / cloud 使用quartz搭建调度中心
【文章来自:on the way】

Quartz是OpenSymphony开源组织在Job……


深度解析VIM
【文章来自:猫】

VI和VIM本质上是一种软件,在我的映象中……


纵横科技IT运维系统与金笛短信设备集成
【文章来自:金笛后花园】

烟台地区最早取得ITSS认证的信息化服务企业……


金笛短信设备集成远程监控机房的动力系统
【文章来自:金笛后花园】

远程监控机房的动力系统设备和运行环境,或需要……