ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

spring boot 集成 spring-boot-starter-quartz 集群版配置

2022-07-04 11:32:14  阅读:154  来源: 互联网

标签:quartz spring boot springframework job scheduler org import


1、引入依赖

1         <dependency>
2             <groupId>org.springframework.boot</groupId>
3             <artifactId>spring-boot-starter-quartz</artifactId>
4         </dependency>

2、添加quartz配置文件

 1 org.quartz.scheduler.instanceName = schedulerFactoryBean
 2 org.quartz.scheduler.instanceId = AUTO
 3 org.quartz.jobStore.driverDelegateClass = org.quartz.impl.jdbcjobstore.StdJDBCDelegate
 4 org.quartz.jobStore.tablePrefix = QRTZ_
 5 org.quartz.jobStore.useProperties = false
 6 org.quartz.jobStore.isClustered=true
 7 org.quartz.jobStore.clusterCheckinInterval=30000
 8 org.quartz.threadPool.class = org.quartz.simpl.SimpleThreadPool
 9 org.quartz.threadPool.threadCount = 10
10 org.quartz.threadPool.threadPriority = 5

3、quartz 使用

  1.  开启配置
 1 package cn.xs.qishi.cas.quartz;
 2 
 3 import cn.xs.ambi.jds.dd.RoutingDatasource;
 4 import org.quartz.spi.JobFactory;
 5 import org.quartz.spi.TriggerFiredBundle;
 6 import org.springframework.beans.factory.annotation.Autowire;
 7 import org.springframework.beans.factory.annotation.Autowired;
 8 import org.springframework.beans.factory.config.AutowireCapableBeanFactory;
 9 import org.springframework.context.ApplicationContext;
10 import org.springframework.context.ApplicationContextAware;
11 import org.springframework.context.annotation.Bean;
12 import org.springframework.context.annotation.Configuration;
13 import org.springframework.core.io.ClassPathResource;
14 import org.springframework.scheduling.quartz.SchedulerFactoryBean;
15 import org.springframework.scheduling.quartz.SpringBeanJobFactory;
16 
17 /**
18  * @author liuxn
19  * @date 2022/6/28
20  */
21 @Configuration
22 public class SchedulerConfig {
23 
24     @Autowired
25     private RoutingDatasource datasource;
26 
27     public static class AutowiringSpringBeanJobFactory extends SpringBeanJobFactory implements
28             ApplicationContextAware {
29 
30         private transient AutowireCapableBeanFactory beanFactory;
31 
32         @Override
33         public void setApplicationContext(final ApplicationContext context) {
34             beanFactory = context.getAutowireCapableBeanFactory();
35         }
36 
37         @Override
38         protected Object createJobInstance(final TriggerFiredBundle bundle) throws Exception {
39             final Object job = super.createJobInstance(bundle);
40             beanFactory.autowireBean(job);
41             return job;
42         }
43     }
44 
45 
46     @Bean
47     public JobFactory jobFactory() {
48         AutowiringSpringBeanJobFactory jobFactory = new AutowiringSpringBeanJobFactory();
49         return jobFactory;
50     }
51 
52 
53     @Bean(destroyMethod = "destroy", autowire = Autowire.NO)
54     public SchedulerFactoryBean schedulerFactoryBean(JobFactory jobFactory) throws Exception {
55         SchedulerFactoryBean schedulerFactoryBean = new SchedulerFactoryBean();
56         //将spring管理job自定义工厂交由调度器维护
57         schedulerFactoryBean.setJobFactory(jobFactory);
58         //设置覆盖已存在的任务
59         schedulerFactoryBean.setOverwriteExistingJobs(true);
60         //设置数据源,使用与项目统一数据源
61         schedulerFactoryBean.setDataSource(datasource);
62         //设置配置文件位置
63         schedulerFactoryBean.setConfigLocation(new ClassPathResource("/quartz.properties"));
64         return schedulerFactoryBean;
65     }
66 }

备注:以上是业务和quartz使用同一个数据源若使用独立数据源则使用注解 @QuartzDataSource 

  2. 业务使用

 1 package cn.xs.qishi.cas.quartz;
 2 
 3 import cn.xs.ambi.bas.util.DateUtils;
 4 import cn.xs.qishi.cas.constant.Constant;
 5 import lombok.CustomLog;
 6 import org.quartz.*;
 7 import org.springframework.beans.factory.annotation.Autowired;
 8 import org.springframework.stereotype.Component;
 9 
10 import java.util.Date;
11 
12 /**
13  * 定时任务调度器
14  *
15  * @author liuxn
16  * @date 2022/6/28
17  */
18 @Component
19 @CustomLog
20 public class MonitorWoJobService {
21 
22     @Autowired
23     private Scheduler scheduler;
24 
25     //删除任务
26     public void deleteJob(JobDto job) throws SchedulerException {
27         JobKey jobKey = JobKey.jobKey(job.getJobNo(), job.getJobGroup());
28         TriggerKey triggerKey = TriggerKey.triggerKey(job.getJobNo(), job.getJobGroup());
29         boolean exists = scheduler.checkExists(jobKey);
30         Trigger trigger = scheduler.getTrigger(triggerKey);
31         if (exists && trigger != null) {
32             // 停止触发器
33             scheduler.pauseTrigger(triggerKey);
34             // 移除触发器
35             scheduler.unscheduleJob(triggerKey);
36             // 删除任务
37             scheduler.deleteJob(jobKey);
38         }
39         log.info(">> 删除任务taskId:" + job.getJobId() + "taskNo:[" + job.getJobNo() + "]");
40     }
41 
42     //更新任务
43     public void updateJob(JobDto job) throws SchedulerException {
44         TriggerKey triggerKey = TriggerKey.triggerKey(job.getJobNo(), job.getJobGroup());
45         Date startAt = DateBuilder.evenHourDateBefore(job.getStart());
46         SimpleTrigger trigger = (SimpleTrigger) scheduler.getTrigger(triggerKey);
47         TriggerBuilder<SimpleTrigger> triggerBuilder = trigger.getTriggerBuilder();
48         SimpleScheduleBuilder newBuilder = SimpleScheduleBuilder.simpleSchedule().withIntervalInMinutes(job.getInterval()).repeatForever();
49         triggerBuilder.withIdentity(triggerKey).withSchedule(newBuilder);
50         triggerBuilder.startAt(startAt);
51         if (job.getEnd() != null) {
52             triggerBuilder.endAt(job.getEnd());
53         }
54         trigger = triggerBuilder.build();
55         scheduler.rescheduleJob(triggerKey, trigger);
56         log.info(">> 更新任务taskId:" + job.getJobId() + "taskNo:[" + job.getJobNo() + "],开始时间:[" + DateUtils.emptyFormat(startAt) + "],时间间隔:[" + job.getInterval() + "]分钟");
57     }
58 
59     //添加任务
60     public void addJob(JobDto job) throws SchedulerException {
61         JobDetail jobDetail = JobBuilder.newJob(MonitorWoJob.class).withIdentity(job.getJobNo(), job.getJobGroup()).storeDurably().build();
62         Date startAt = DateBuilder.evenHourDateBefore(job.getStart() == null ? new Date() : job.getStart());
63         JobDataMap jobDataMap = jobDetail.getJobDataMap();
64         jobDataMap.put(Constant.Task.TASK_ID, job.getJobId());
65         jobDataMap.put(Constant.Task.TASK_NO, job.getJobNo());
66         Trigger trigger = TriggerBuilder
67                 .newTrigger()
68                 .withSchedule(SimpleScheduleBuilder.repeatMinutelyForever(job.getInterval()))
69                 .usingJobData(jobDataMap).startAt(startAt)
70                 .forJob(jobDetail.getKey())
71                 .build();
72         boolean exists = scheduler.checkExists(jobDetail.getKey());
73         if (exists) {
74             log.info(">> 移除任务");
75             scheduler.pauseTrigger(trigger.getKey());
76             scheduler.unscheduleJob(trigger.getKey());
77             scheduler.deleteJob(jobDetail.getKey());
78         }
79         scheduler.scheduleJob(jobDetail, trigger);
80         log.info(">> 任务调度器启动状态:" + scheduler.isStarted());
81         if (!scheduler.isStarted()) {
82             scheduler.start();
83         }
84         log.info(">> 新增任务taskId:[" + job.getJobId() + "],taskNo:[" + job.getJobNo() + "],开始时间:[" + DateUtils.emptyFormat(startAt) + "],时间间隔:[" + job.getInterval() + "]分钟");
85     }
86 }

  3.任务类

 1 package cn.xs.qishi.cas.quartz;
 2 
 3 import cn.xs.ambi.mgt.redis.RedisManager;
 4 import cn.xs.qishi.cache.key.RedisPrefixOfCas;
 5 import cn.xs.qishi.cas.constant.Constant;
 6 import cn.xs.qishi.cas.service.impl.CasMonitorTaskServiceTx;
 7 import cn.xs.qishi.entity.pojo.WoMonitorRule;
 8 import cn.xs.qishi.entity.pojo.WoMonitorTask;
 9 import com.alibaba.fastjson.JSON;
10 import lombok.CustomLog;
11 import org.quartz.*;
12 import org.springframework.beans.factory.annotation.Autowired;
13 import org.springframework.scheduling.quartz.QuartzJobBean;
14 import org.springframework.stereotype.Component;
15 
16 import java.util.List;
17 
18 /**
19  * 任务
20  *
21  * @author liuxn
22  * @date 2022/6/28
23  */
24 @CustomLog
25 @Component
26 @DisallowConcurrentExecution
27 public class MonitorWoJob extends QuartzJobBean {
28 
29 
30     @Override
31     protected void executeInternal(JobExecutionContext context) throws JobExecutionException {
32         try {
33             JobDataMap jobDataMap = context.getJobDetail().getJobDataMap();
34             log.info(">> 工单监控任务触发 " + JSON.toJSONString(jobDataMap));
35           //todo 实现自己的业务
36         } catch (Exception e) {
37             log.error("工单监控计算job异常", e);
38         }
39     }
40 }

备注:@DisallowConcurrentExecution 注解使用保证了同一个任务只能在一台机器上触发 本demo是才是  SimpleScheduleBuilder 实现。  CronScheduleBuilder 详情见 官放文档 http://www.quartz-scheduler.org/documentation

 

标签:quartz,spring,boot,springframework,job,scheduler,org,import
来源: https://www.cnblogs.com/lxn0216/p/16442326.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有