自定义预警任务打通xxl-job

前端界面会有一个根据 月,周,日设置的定时预警任务

自己去写的话,会花费很多的时间,那么我们可以使用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";
    }

}

测试 设置预警信息

http://localhost:8100/add

设置 每月的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") 的方法信息 

测试 停止任务

http://localhost:8100/stop

输入xxl_job_info表的任务id 

{
    "id":2
}

可以看到xxl-job的任务信息也停止了 

 

执行器表

xxl_job_group

 任务信息表

xxl_job_info

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
earth-frost是一个轻量级分布式任务调度框架。 介绍: 调度模块和执行模块分离 使用redis作为数据库 基于订阅模式实现服务注册和发现 环境: Angular: v1.x JDK: 1.8+ Maven: 3+ Redis: 2.8+ Spring boot: 2.x Thymeleaf: 3 功能: 1.0.0 简单易上手,支持web界面进行任务的CRUD 支持动态修改任务的开始,停止 调度中心支持集群部署,将任务的调度进行封装,支持分配各种不同的任务 执行器支持分布式,支持集群部署,可进行相应分组,在调度中心界面查看 支持伸缩扩展,调度中心和执行器都是基于redis订阅模式进行服务注册发现和任务调度,服务上下线发现及时 支持失败重试 任务监控和报警 动态编译任务,支持web界面编辑任务源码,创建任务 支持父子任务 运行报表 1.1.0 支持钉钉预警通知 调度记录增加执行时间 任务超时报警机制 支持分片任务 支持SimpleTrigger任务 支持非spring项目开发执行器 misfire 1.2.0 修复分片父子任务执行多次问题 增加配置最大日志数 增加Spring项目执行案例 开发: frost-api 对外实体和接口 frost-core 定义调度、执行、注册发现等核心功能的接口和实现 frost-center 调度中心服务,包含安全认证和UI展示,依赖core实现调度逻辑 frost-executor 执行器服务,依赖core实现任务执行逻辑,包含开发脚本任务的部分实例以及配置样例<span> </span> frost-client 客户端api,第三方项目可依赖client实现与调度中心交互

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值