阿里架构师分享:Spring Boot Quartz 分布式集群任务调度实现

Spring Boot Quartz

主要内容

  • Spring Scheduler 框架
  • Quartz 框架,功能强大,配置灵活
  • Quartz 集群
  • mysql 持久化定时任务脚本(tables_mysql.sql)

介绍

在工程中时常会遇到一些需求,例如定时刷新一下配置、隔一段时间检查下网络状态并发送邮件等诸如此类的定时任务。

定时任务本质就是一个异步的线程,线程可以查询或修改并执行一系列的操作。由于本质是线程,在 Java 中可以自行编写一个线程池对定时任务进行控制,但这样效率太低了,且功能有限,属于重复造轮子。

分布式任务调度应用场景

Quartz的集群功能通过故障转移和负载平衡功能为您的调度程序带来高可用性和可扩展性。

调度程序中会有很多定时任务需要执行,一台服务器已经不能满足使用,需要解决定时任务单机单点故障问题。

用Quartz框架,在集群环境下,通过数据库锁机制来实现定时任务的执行;独立的 Quartz 节点并不与另一其的节点或是管理节点通信。

Spring Scheduler 实现定时任务

1.定义 Task 类

2.启动定时任务

在Spring Boot的主类中加入@EnableScheduling注解,启用定时任务的配置

quartz实现分布式定时任务

quartz 是一个开源的分布式调度库,它基于java实现。

> 它有着强大的调度功能,支持丰富多样的调度方式,比如简单调度,基于cron表达式的调度等等。

> 支持调度任务的多种持久化方式。比如支持内存存储,数据库存储,Terracotta server 存储。

> 支持分布式和集群能力。

> 采用JDBCJobStore方式存储时,针对事务的处理方式支持全局事务(和业务服务共享同一个事务)和局部事务(quarzt 单独管理自己的事务)

> 基于plugin机制以及listener机制支持灵活的扩展。

1.pom.xml配置


2.spring-quartz.properties集群配置

3.定义两个job

  • QuartzJob.java

  • QuartzJob2.java

4.初始化触发器等信息,这里通过Listener初始化

@Slf4j
public class StartApplicationListener implements ApplicationListener<ContextRefreshedEvent> {
 @Autowired
 SchedulerConfig schedulerConfig;
 public static AtomicInteger count = new AtomicInteger(0);
 private static String TRIGGER_GROUP_NAME = "test_trriger";
 private static String JOB_GROUP_NAME = "test_job";
 @Override
 public void onApplicationEvent(ContextRefreshedEvent event) {
 // 防止重复执行
 if (event.getApplicationContext().getParent() == null && count.incrementAndGet() <= 1) {
 initMyJob();
 }
 }
 public void initMyJob() {
 Scheduler scheduler = null;
 try {
 scheduler = schedulerConfig.scheduler();
 TriggerKey triggerKey = TriggerKey.triggerKey("trigger1", TRIGGER_GROUP_NAME);
 CronTrigger trigger = (CronTrigger) scheduler.getTrigger(triggerKey);
 if (null == trigger) {
 Class clazz = QuartzJob.class;
 JobDetail jobDetail = JobBuilder.newJob(clazz).withIdentity("job1", JOB_GROUP_NAME).build();
 CronScheduleBuilder scheduleBuilder = CronScheduleBuilder.cronSchedule("0/10 * * * * ?");
 trigger = TriggerBuilder.newTrigger().withIdentity("trigger1", TRIGGER_GROUP_NAME)
 .withSchedule(scheduleBuilder).build();
 scheduler.scheduleJob(jobDetail, trigger);
 log.info("Quartz 创建了job:...:{}", jobDetail.getKey());
 } else {
 log.info("job已存在:{}", trigger.getKey());
 }
 TriggerKey triggerKey2 = TriggerKey.triggerKey("trigger2", TRIGGER_GROUP_NAME);
 CronTrigger trigger2 = (CronTrigger) scheduler.getTrigger(triggerKey2);
 if (null == trigger2) {
 Class clazz = QuartzJob2.class;
 JobDetail jobDetail2 = JobBuilder.newJob(clazz).withIdentity("job2", JOB_GROUP_NAME).build();
 CronScheduleBuilder scheduleBuilder = CronScheduleBuilder.cronSchedule("0/15 * * * * ?");
 trigger2 = TriggerBuilder.newTrigger().withIdentity("trigger2", TRIGGER_GROUP_NAME)
 .withSchedule(scheduleBuilder).build();
 scheduler.scheduleJob(jobDetail2, trigger2);
 log.info("Quartz 创建了job:...:{}", jobDetail2.getKey());
 } else {
 log.info("job已存在:{}", trigger2.getKey());
 }
 scheduler.start();
 } catch (Exception e) {
 log.info(e.getMessage());
 }
 }
}

5.启动定时器

启动两个Application,分别是示例中的DemoQuartzApplication和DemoQuartzApplication2,会发现,两个Job会分别在两个应用执行。

当手动停止一个应用的时候,另一个应用会自动接管所有任务并继续执行,如果任务太多,我们可以再开一台服务即可。实现了调度任务的高可用性和可扩展性

运行效果如图:

标签: 分布式任务集群任务QuartzString BootTask定时任务高可用高可扩展持久化mysql

文章自:博客园

作者:云天

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Spring Boot提供了一种简单而强大的方式来实现定时任务调度。下面是使用Spring Boot实现定时任务调度的步骤: 1. 添加依赖:在`pom.xml`文件中添加Spring Boot的定时任务依赖: ```xml <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-quartz</artifactId> </dependency> ``` 2. 创建定时任务类:创建一个继承自`QuartzJobBean`的定时任务类,并实现`executeInternal`方法,该方法中编写具体的定时任务逻辑。 ```java import org.quartz.JobExecutionContext; import org.quartz.JobExecutionException; import org.springframework.scheduling.quartz.QuartzJobBean; public class MyJob extends QuartzJobBean { @Override protected void executeInternal(JobExecutionContext context) throws JobExecutionException { // 定时任务逻辑 System.out.println("定时任务执行中..."); } } ``` 3. 配置定时任务:在`application.properties`或`application.yml`文件中配置定时任务的相关属性,例如触发时间、触发频率等。 ```yaml spring: quartz: job-store-type: memory properties: org: quartz: scheduler: instanceName: MyScheduler instanceId: AUTO job-details: my-job: cron: 0/5 * * * * ? job-class-name: com.example.MyJob ``` 4. 启动定时任务:在Spring Boot的启动类上添加`@EnableScheduling`注解,开启定时任务的自动配置。 ```java import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; import org.springframework.scheduling.annotation.EnableScheduling; @SpringBootApplication @EnableScheduling public class Application { public static void main(String[] args) { SpringApplication.run(Application.class, args); } } ``` 5. 运行定时任务:启动Spring Boot应用程序后,定时任务将按照配置的触发时间和频率执行。 以上就是使用Spring Boot实现定时任务调度的基本步骤。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值