本文介绍了弹簧引导集成弹簧调度器和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分钟。