前端界面会有一个根据 月,周,日设置的定时预警任务
自己去写的话,会花费很多的时间,那么我们可以使用xxl-job进行关联
前端该怎么设置,怎么设置,但是定时的信息,我们放在了xxl-job里面
我们的项目只要设置好corn表达式和@XxlJob 对应的处理方法就好
下载xxl-job
xxl-job: 一个分布式任务调度平台,其核心设计目标是开发迅速、学习简单、轻量级、易扩展。现已开放源代码并接入多家公司线上产品线,开箱即用。
然后把sql进行初始化
修改mysql配置
启动xll-job项目 ,访问下面的地址,账号 admin 密码 123456
http://localhost:8080/xxl-job-admin
在执行器管理新增自己的执行器,机器地址不用填写,等配置的项目启动后 会自动生成
如果没有显示 那么 xxl-job的项目 在重启一次 就好了
配置任务管理,提前设置好日,周,月的任务信息,但是不要启动
配置自己的项目
在自己的pom.xml引入jar
<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-test</artifactId> <scope>test</scope> </dependency> <dependency> <groupId>com.lxgnb</groupId> <artifactId>xxl-job-boot-starter</artifactId> <version>2.3.0-jobinfo-executor-2</version> </dependency> <!--lombok--> <dependency> <groupId>org.projectlombok</groupId> <artifactId>lombok</artifactId> </dependency>
在application.yml配置xxl-job的信息 执行器要设置我们自定义的执行器
server:
port: 8100
xxl:
job:
sdk:
admin-url: http://127.0.0.1:8080/xxl-job-admin
user-name: admin
password: 123456
#在xxl-job配置好的 执行器的名字
appname: my-app
access-token: default_token
实体类
package com.dmg.ds.entity;
import lombok.Data;
@Data
public class YuJing {
//xxl_job_info表的主键
private Integer id;
//类型: m:月 ,z:周, d:日
private String type;
//小时
private String hours;
//分钟
private String min;
//每月的几号
private String hao;
/**
* 星期几 可以多个以逗号拼接 mon,tue,wed,thu,fri,sat,sun
* mon 星期一
* tue 星期二
* wed 星期三
* thu 星期四
* fri 星期五
* sat 星期六
* sun 星期日
*/
private String zhou;
}
定时任务
和xxl-job设置的任务要匹配
package com.dmg.ds.job;
import com.xxl.job.core.handler.annotation.XxlJob;
import org.springframework.stereotype.Component;
@Component
public class MyJob {
/**
* 日类型 预警定时任务
*/
@XxlJob("dayHandler")
public void dayHandler(){
System.out.println("我是日预警定时任务========================");
}
/**
* 周类型 预警定时任务
*/
@XxlJob("zhouHandler")
public void zhouHandler(){
System.out.println("我是周预警定时任务========================");
}
/**
* 月类型 预警定时任务
*/
@XxlJob("yueHandler")
public void yueHandler(){
System.out.println("我是月预警定时任务========================");
}
}
接口层
在这里和xxl-job进行打通,提前在xxl-job设置好任务
public interface YuJingService {
public void add(YuJing yuJing);
public void stop(YuJing yuJing);
}
package com.dmg.ds.service.impl;
import com.dmg.ds.entity.YuJing;
import com.dmg.ds.service.YuJingService;
import com.xiaogang.xxljobadminsdk.constants.ExecutorBlockStrategyEnum;
import com.xiaogang.xxljobadminsdk.constants.ExecutorRouteStrategyEnum;
import com.xiaogang.xxljobadminsdk.constants.MisfireStrategyEnum;
import com.xiaogang.xxljobadminsdk.constants.ScheduleTypeEnum;
import com.xiaogang.xxljobadminsdk.model.JobUpdateParam;
import com.xiaogang.xxljobadminsdk.model.XxlJobInfo;
import com.xiaogang.xxljobadminsdk.service.XxlJobService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import java.text.DateFormat;
import java.text.SimpleDateFormat;
import java.util.Date;
@Service
public class YuJingServiceImpl implements YuJingService {
@Autowired
private XxlJobService xxlJobService;
private static DateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
/**
* 设置预警信息
*/
@Override
public void add(YuJing yuJing) {
//主键
Integer taskId=0;
//corn 表达式
String scheduleConf="";
//修改xxl-job的任务信息
JobUpdateParam jobUpdateParam = new JobUpdateParam();
if(yuJing.getType().equals("m")){
//月
scheduleConf=getCornYue(yuJing);
//主键 写死 因为我们已经在xxl-job 提前设置好了任务
taskId=5;
jobUpdateParam.setJobDesc("月预警信息");
//和@XxlJob关联
jobUpdateParam.setExecutorHandler("yueHandler");
}else if(yuJing.getType().equals("z")){
//周
scheduleConf=getCornZhou(yuJing);
//主键 写死 因为我们已经在xxl-job 提前设置好了任务
taskId=4;
jobUpdateParam.setJobDesc("周预警信息");
//和@XxlJob关联
jobUpdateParam.setExecutorHandler("zhouHandler");
}else {
//日
scheduleConf=getCornDay(yuJing);
//主键 写死 因为我们已经在xxl-job 提前设置好了任务
taskId=2;
jobUpdateParam.setJobDesc("日预警信息");
//和@XxlJob关联
jobUpdateParam.setExecutorHandler("dayHandler");
}
jobUpdateParam.setId(taskId);
jobUpdateParam.setScheduleConf(scheduleConf);
jobUpdateParam.setAuthor("负责人");
jobUpdateParam.setAlarmEmail("负责人邮箱@qq.com");
//my-app对应的xxl_job_group表id
jobUpdateParam.setJobGroup(2);
//写死
jobUpdateParam.setScheduleType(ScheduleTypeEnum.CRON);
jobUpdateParam.setExecutorRouteStrategy(ExecutorRouteStrategyEnum.FIRST);
jobUpdateParam.setMisfireStrategy(MisfireStrategyEnum.DO_NOTHING);
jobUpdateParam.setExecutorBlockStrategy(ExecutorBlockStrategyEnum.SERIAL_EXECUTION);
jobUpdateParam.setExecutorTimeout(0);
jobUpdateParam.setExecutorFailRetryCount(0);
xxlJobService.update(jobUpdateParam);
//启动任务
xxlJobService.start(taskId);
}
/**
* 停止预警任务
* @param yuJing
*/
@Override
public void stop(YuJing yuJing) {
xxlJobService.stop(yuJing.getId());
}
/**
* 设置日 预警信息
*/
private String getCornDay(YuJing yuJing){
//0 10 1 * * ?
//这个表达式对应 每天1点10分0秒触发任务
//注意空格
StringBuilder sb=new StringBuilder();
sb.append("0 ");
sb.append(yuJing.getMin()).append(" ");
sb.append(yuJing.getHours()).append(" ");
sb.append("* * ?");
//拼接corn表达式
return sb.toString();
}
/**
* 设置周 预警信息
*/
private String getCornZhou(YuJing yuJing){
//0 10 7 ? * mon,tue,wed,thu,fri,sat,sun
//这个表达式对应 周一到周日 每天7点 10分 0秒
//注意空格
StringBuilder sb=new StringBuilder();
sb.append("0 ");
sb.append(yuJing.getMin()).append(" ");
sb.append(yuJing.getHours()).append(" ");
sb.append("? * ");
sb.append(yuJing.getZhou());
//拼接corn表达式
return sb.toString();
}
/**
* 设置月 预警信息
*/
private String getCornYue(YuJing yuJing){
//0 10 1 20 * ?
//这个表达式对应 每月20号 1点 10分 0秒
//注意空格
StringBuilder sb=new StringBuilder();
sb.append("0 ");
sb.append(yuJing.getMin()).append(" ");
sb.append(yuJing.getHours()).append(" ");
sb.append(yuJing.getHao()).append(" ");
sb.append("* ?");
//拼接corn表达式
return sb.toString();
}
}
控制层
package com.dmg.ds.controller;
import com.dmg.ds.entity.YuJing;
import com.dmg.ds.service.YuJingService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RestController;
@RestController
public class YuJingController {
@Autowired
private YuJingService yuJingService;
/**
* 设置预警任务
* @param yuJing
* @return
*/
@PostMapping("/add")
public String add(@RequestBody YuJing yuJing){
yuJingService.add(yuJing);
return "success";
}
/**
* 停止预警任务
* @param yuJing
* @return
*/
@PostMapping("/stop")
public String stop(@RequestBody YuJing yuJing){
yuJingService.stop(yuJing);
return "success";
}
}
测试 设置预警信息
月
设置 每月的13号 16点 59分 执行定时任务
{
"type":"m",
"hours":"16",
"min":"59",
"hao":"13",
"zhou":""
}
那么到了时间,就会触发 @XxlJob("yueHandler") 的方法信息
周
设置执行的时间为 每周六,每周日的17点 01分 执行,可以设置多个星期,也可以设置单个星期
{
"type":"z",
"hours":"17",
"min":"01",
"hao":"",
"zhou":"sat,sun"
}
那么到了时间,就会触发 @XxlJob("zhouHandler") 的方法信息
日
设置执行的时间为 每天的17点 04分 执行
{
"type":"d",
"hours":"17",
"min":"04",
"hao":"",
"zhou":""
}
那么到了时间,就会触发 @XxlJob("dayHandler") 的方法信息
测试 停止任务
输入xxl_job_info表的任务id
{
"id":2
}
可以看到xxl-job的任务信息也停止了
执行器表
xxl_job_group
任务信息表
xxl_job_info