其他分享
首页 > 其他分享> > spring boot 定时器

spring boot 定时器

作者:互联网

spring boot定时器设置

 

在启动类上加注解

@EnableScheduling   开启定时器功能

今天做这个功能有点点复杂

大概就是 查询每条数据的流程节点执行人 和 当前流程节点
将筛选后的用户 去重 分别发出审核消息 和上报消息
数据一张表 定时任务一张表 定时任务表上写cron表达式

开启一个定时任务 将定时任务表与数据表联查 查出需要发消息的时间和用户

接下来是代码实现

代码不能直接贴
写成伪代码 凑活看吧



@Configuration      //1.主要用于标记配置类,兼备Component的效果。
@EnableScheduling // 2.开启定时任务(单线程
@RequiredArgsConstructor

//此类用于在系统重启或宕机后重启流程部署的定时任务
public class Config {

注入service层

@Scheduled(cron = "0 0 1 * * ?")
//初始化方法 每天一点执行一次
private void initProcess(){

      调用service层方法 查询出 定时任务表内的定时任务

List.forEach(scheduleTask -> {
//如果任务已存在会抛出异常 捕获异常后不做处理
try{
          //尝试开启定时任务
Service.start(scheduleTask);
}catch (Exception e){

}

});
}
}


service层的start方法

service层中第一了一个map 用于看定时任务是否重复
private Map<String, ScheduledFuture<?>> futureMap = new HashMap<>();

start(参数){
if (futureMap.containsKey(参数.getId())) {
throw Exception("已经存在重复任务");
}
//从数据库取出的cron表达式
String cron = 参数.getCron();


//这个是最重要的 虽然不知道什么原理 api调用工程师
ScheduledFuture<?> future = threadPoolTaskScheduler.schedule(new MyRunnable(参数), new CronTrigger(cronExp));
System.out.println("开启定时任务");

//将参数id写进map
futureMap.put(参数.getId(), future);
}


myrunnable 类
private class MyRunnable implements Runnable {

run(){
    将参数与数据表联查

查出需要发消息的用户id
调用发送消息接口
发送消息不是我写的,能用就行


}


}

现在回顾看起来很简单,写了两天
缺陷是 cron表达式转换为中文字符串 找不到工具类 直接把cron表达式中文字符串在表里加了一个字段存起来
定时任务表每多一行就需要多开一个定时任务 我也不知道以后会怎样 感觉不太行的样子



标签:定时器,service,spring,boot,开启,cron,任务,参数,定时
来源: https://www.cnblogs.com/bawanglong168/p/16661975.html