弹簧引导集成弹簧调度器和Quartz调度器

  

本文介绍了弹簧引导集成弹簧调度器和Quartz调度器的基础知识,利用夏德罗克解决弹簧调度器多实例运行冲突,介绍了石英ScheduleBuilder,日历,介绍了动态创建石英工作的方法。

  

GitHub源码   

春调度器

  

Spring框架提供了简单,易用的工作调度框架弹簧调度器。

  

示例

  

在春天引导中,只需两步即可启用调度器:

  
      <李>启用调度李   
  
 <代码>包org.itrunner.heroes.scheduling;
  
  进口org.springframework.context.annotation.Configuration;
  进口org.springframework.scheduling.annotation.EnableScheduling;
  
  @ configuration
  @EnableScheduling
  公开课ScheduleConfig {
  } 
     <李>定义安排方法      
 <代码>包org.itrunner.heroes.scheduling;
  
  进口lombok.extern.slf4j.Slf4j;
  进口org.springframework.scheduling.annotation.Scheduled;
  进口org.springframework.stereotype.Component;
  
  @ component
  @Slf4j
  公开课HelloSpring {
  
  @Scheduled (cron=" 10 0 */* * * *”)
  公共空间sayHello () {
  log.info(“你好弹簧调度器”);
  }
  
  } 
  

@Scheduled支持cron、fixedDelay fixedRate三种定义方式,方法必须没有参数,返回空白类型。

  

夏德罗克

  

默认情况下,弹簧无法同步多个实例的调度程序,而是在每个节点上同时执行作业。我们可以使用shedlock-spring解决这一问题,确保在同一时间仅调度一次任务。

  
 <代码> & lt; dependency>
  & lt; groupId> net.javacrumbs.shedlock
  & lt; artifactId> shedlock-spring
  & lt; version> 4.1.0
  & lt;/dependency>
  & lt; dependency>
  & lt; groupId> net.javacrumbs.shedlock
  & lt; artifactId> shedlock-provider-jdbc-template
  & lt; version> 4.1.0
  & lt;/dependency>  
  

夏德罗克是利用数据库锁机制实现的,当前支持DynamoDB, Hazelcast,蒙戈,复述,动物园管理员和任何JDBC驱动程序。为了使用JDBC,增加下面依赖:

  
 <代码> & lt; dependency>
  & lt; groupId> net.javacrumbs.shedlock
  & lt; artifactId> shedlock-provider-jdbc-template
  & lt; version> 4.1.0
  & lt;/dependency>  
  

创建夏德罗克实体:

  
 <代码>包org.itrunner.heroes.domain;
  
  进口lombok.Data;
  
  进口javax.persistence.Column;
  进口javax.persistence.Entity;
  进口javax.persistence.Id;
  进口javax.persistence.Table;
  进口java.time.LocalDateTime;
  
  @ entity
  @ table (name="夏德罗克”)
  @ data
  公开课夏德罗克{
  @ id
  @ column (name=懊帧?长度=64)
  私人字符串名称;
  
  @ column (name=" lock_until ")
  私人LocalDateTime lockUntil;
  
  @ column (name=" locked_at ")
  私人LocalDateTime lockedAt;
  
  @ column (name=" locked_by ")
  私人字符串lockedBy;
  } 
  

启用夏德罗克:

  
 <代码>包org.itrunner.heroes.scheduling;
  
  进口net.javacrumbs.shedlock.core.LockProvider;
  进口net.javacrumbs.shedlock.provider.jdbctemplate.JdbcTemplateLockProvider;
  进口net.javacrumbs.shedlock.spring.annotation.EnableSchedulerLock;
  进口org.springframework.context.annotation.Bean;
  进口org.springframework.context.annotation.Configuration;
  进口org.springframework.scheduling.annotation.EnableScheduling;
  
  进口javax.sql.DataSource;
  
  @ configuration
  @EnableScheduling
  @EnableSchedulerLock (defaultLockAtMostFor=癙T30S”)
  公开课ScheduleConfig {
  
  @ bean
  公共LockProvider LockProvider(数据源的数据源){
  返回新JdbcTemplateLockProvider(数据源);
  }
  
  } 
  
 <代码>包org.itrunner.heroes.scheduling;
  
  进口lombok.extern.slf4j.Slf4j;
  进口net.javacrumbs.shedlock.spring.annotation.SchedulerLock;
  进口org.springframework.scheduling.annotation.Scheduled;
  进口org.springframework.stereotype.Component;
  
  @ component
  @Slf4j
  公开课HelloSpring {
  
  @Scheduled (cron=" 10 0 */* * * *”)
  @SchedulerLock (name=" helloSpringScheduler lockAtLeastFor=癙T30S lockAtMostFor=癙T3M”)
  公共空间sayHello () {
  log.info(“你好弹簧调度器”);
  }
  
  } 
  

其中lockAtLeastFor和lockAtMostFor设置锁的最短和最长时间,上例分别为30秒,3分钟。

弹簧引导集成弹簧调度器和Quartz调度器