任务:定时看有没有过期(put in time 和thing_time的计算),如果有的话给个推送(推送后面再做)
 
 
一、@Scheduled的使用
 1 1.maven依赖
 2     <dependency>
 3         <groupId>org.springframework</groupId>
 4         <artifactId>spring-context-support</artifactId>
 5     </dependency>
 6 
 7 2.在启动类(springbootApplication)里面使能定时器
 8     @EnableScheduling
 9 
10 3.定时任务类
11 。万能@component
12 。@Scheduled设置定时任务方法
13 。@Scheduled属性cron表达式:
14         定时任务触发时间的一个字符串表达式

 

二、Cron表达式
有两种语法结构:
1 1.七个域
2 Seconds Mintues Hours Month Weak Year
3 2.六个域
4 Seconds Mintues Hours Month Weak

各字段含义

 

 (星期:1->星期日,7->星期六)

 

 

eg:

 

 

三、Quartz使用思路
 
1.思路:
1 1.job - 任务 - 要做什么
2 2.Trigger - 触发器 - 什么时候去做
3 3.Scheduler - 任务调度 - 什么时候需要去做什么

 

2.Quartz基本使用方式(用JAVASE做一个简单demo):
1 demo.java
2 1.定义任务类
3 //实现Job接口

 

 

 1 main.java
 2 1.job - 任务 - 要做什么
 3 //创建Job对象
 4 JobDetail job = JobBuilder.newJob(demo.class).build
 5 
 6 2.Trigger - 触发器 - 什么时候去做
 7 //第一种方法:简单的trigger触发时间:通过Quartz提供一个方法来完成简单的重复调用
 8 Trigger trigger = TriggerBuilder.newTrigger().withSchedule(
 9     SimpleScheduleBuilder.repeatSecondlyForever()
10 ).build
11 
12 
13 //第二种方法:cron Trigger:按照cron表达式来给定触发时间
14 Trigger trigger = TriggerBuilder.newTrigger().withSchedule(
15     CronShceduleBuilder.cronSchedule("0/1 * * * * ?")
16 ).build
17 
18 
19 3.Scheduler - 任务调度 - 什么时候需要去做什么
20 Scheduler scheduler = StdSchedulerFactory.getDefaultScheduler();
21 
22 scheduler.scheduleJob(job, trigger);
23 
24 4.启动
  scheduler.start();

 

 
四、spring整合Quartz(SSM)
1.maven依赖
 1 <!--Quartz坐标-->
 2 <dependency>
 3     <groupId>org.quartz-scheduler</groupId>
 4     <artifactId>quartz</artifactId>
 5     <version>2.2.1</version>
 6 </dependency>
 7 
 8 <!--添加Scheduled坐标-->
 9 <dependency>
10     <groupId>org.springframework</groupId>
11     <artifactId>spring-context-support</artifactId>
12 </dependency>
13 
14 <!--Sprngtx坐标-->
15 <dependency>
16     <groupId>org.springframework</groupId>
17     <artifactId>spring-tx</artifactId>
18 </dependency>

 

2.Job任务类

 

 

3.Quartz配置类
 1 1.@Configuartion注解
 2 2.按Quartz的思路写配置
 3     。创建Job对象并实例化
 4     @Bean
 5     public JobDetailFactoryBean jobDetailFactoryBean(){
 6     JobDetailFactoryBean factory = new JobDetailFactoryBean();
 7 
 8 
 9     factory.setJobClass(QuartzDemo.class);
10     //关联上一步写的Job类
11     return factory;
12     }
13     。创建Trigger对象
14     方法一
15 :    @Bean
16   public SimpleTriggerFactoryBean
17  simpleTriggerFactoryBean(JobDetailFactoryBean jobDetailFactoryBean){
18     SimpleTriggerFactoryBean factory = new SimpleTriggerFactoryBean();
19 
20     factory.setJobDetail(jobDetailFactoryBean.getObject());    //关联jobDetail对象
21     factory.setRepeatInterval(2000);
22     //设置触发时间    该参数表示一个执行的毫秒数
23     factory.setReatCount(5);    //设置重复次数
24     return factory;
25     }
26     方法二:
27     @Bean
28     public CronTriggerFactoryBean CronTriggerFactoryBean(JobDetailFactoryBean jobDetailFactoryBean){
29     CronTriggerFactoryBean factory = new CronTriggerFactoryBean();
30     factory.setJobDetail(jobDetailFactoryBean.getObject());    //关联jobDetail对象
31     factory.setCronExpression("0/1 * * * * ?");    //设置触发时间
32     return factory;
33     }
34     (由于需要关联,此方法对应的ScheduleFactoryBean的入参也要修改成CronTriggerFactoryBean)
35     。创建Schedule对象
36     @Bean
37     public ScheduleFactoryBean ScheduleFactoryBean(SimpleTriggerFactoryBean simpleTriggerFactoryBean){ 
38    ScheduleFactoryBean factory = new ScheduleFactoryBean();
39     factory.setTriggers(simpleTriggerFactoryBean.getObject());    //关联trigger
40     return factory;
41     }

 

4.启动类(springbootApplication)

1 。@EnableSchedule

 

五、job对象注入
 
1.job类中对service层的要实现的类注入
1 。使用@Autowired

 

2.写一个新的AdaptableFactory
(由于原来的job对象实例化时使用的jobDetailFactoryBean factory 只是采用反射的机制,SpringIOC容器里面没有这个类所以无法直接成功注入,要写一个新的AdaptableFactory,重写里面的createJobInstance方法,手动将创建的对象放到springioc容器中)
 
 1 package com.bjsxt.config;
 2 
 3 import org.quartz.spi.TriggerFiredBundle;
 4 import org.springframework.scheduling.quartz.AdaptableJobFactory;
 5 
 6 @Component("myAdaptableJobFactory")
 7 public class MyAdaptableJobFactory extends AdaptableJobFactory{
 8         //AutowireCapableBeanFactory 可以将一个对象添加到springioc容器中并且完成对象注入
 9     @Autowired
10     private AutowireCapableBeanFactory autowireCapableBeanFactory;
11     //该方法需要将实例化的任务对象手动的添加到springIOC容器中并且完成对象的注入
12     @ Override
13     protected Object createJobInstance(TriggerFiredBundle bundle) throws  Exception{
14         Object obj = super. createJobInstance(bundle);
15         //将obj对象添加到springioc并完成注入
16         this.autowireCapableBeanFactory.autowireBean(obj);
17         return obj;
18     }
19 }

 

3.在配置类的Scheduler对象创建方法里面修改调用刚才写的新AdaptableFactory

1     @Bean
2     public ScheduleFactoryBean ScheduleFactoryBean(SimpleTriggerFactoryBean simpleTriggerFactoryBean){
3     ScheduleFactoryBean factory = new ScheduleFactoryBean();
4     factory.setTriggers(simpleTriggerFactoryBean.getObject());    //关联trigger
5     factory.setJobFactory("myAdaptableFactory");    //新AdaptableFactory
6     return factory;
7     }

 

 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
posted on 2022-08-11 13:20  Jolyne123  阅读(170)  评论(0)    收藏  举报