动态创建xxl-job任务

这篇具有很好参考价值的文章主要介绍了动态创建xxl-job任务。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

1.需求背景:微信小程序秒杀模块有个订阅功能,当用户点击完订阅后,要在活动开始的前10分钟调用微信接口发送订阅消息给用户
2.思路:本地创建秒杀订阅表,当用户添加或者取消时对应表中数据的增删,添加数据时动态创建一条xxljob的定时任务,取消时删除它
xxl-job有两种创建任务的方式,第一种就是我们使用xxl-job的图形化页面,第二种直接调用xxl-job的接口(其实图形化页面也是使用了调用接口的方式)

废话少说,下面是工具类和示例代码以供参考

@Component
public class XxlJobUtil {
    public static final int SUCCESS_CODE = 200;
    private static String adminAddresses;
    private static String appname;
    private static Integer groupId;
    private static String accessToken;

    @Value("${xxl.job.admin.addresses}")
    public void setAdminAddresses(String adminAddresses) {
        XxlJobUtil.adminAddresses = adminAddresses;
    }

    @Value("${xxl.job.accessToken}")
    public void setAccessToken(String accessToken) {
        XxlJobUtil.accessToken = accessToken;
    }

    @Value("${xxl.job.executor.appname}")
    public void setAppname(String appname) {
        XxlJobUtil.appname = appname;
    }

    @PostConstruct
    public void init() {
        initGroupId();
    }

    private static final String ADD_URL = "/ext/jobinfo/add";
    private static final String UPDATE_URL = "/ext/jobinfo/update";
    private static final String REMOVE_URL = "/ext/jobinfo/remove";
    private static final String PAUSE_URL = "/ext/jobinfo/stop";
    private static final String START_URL = "/ext/jobinfo/start";
    private static final String ADD_AND_START_URL = "/ext/jobinfo/add-and-start";
    private static final String GET_GROUP_ID = "/ext/jobgroup/get-group-id";


    /**
     * 添加任务
     * @param jobInfo 任务信息
     * @return {@link String} 任务id
     * @author kritofgo
     * @date 2022/05/27 17:37
     **/
    public static String add(XxlJobInfo jobInfo) {
        jobInfo.setJobGroup(groupId);
        return doPost(adminAddresses + ADD_URL, jobInfo, String.class);
    }

    /**
     * 初始化获取执行器id
     * @author kritofgo
     * @date 2022/05/27 17:37
     **/
    public static void initGroupId() {
        // 查询对应groupId:
        Map<String, Object> param = new HashMap<>(4);
        param.put("appname", appname);
        Integer groupId = doPost(adminAddresses + GET_GROUP_ID, param, Integer.class);
        if (groupId == null) {
            throw new XllJobRemoteException(String.format("【xxl-job】接口调用未获取到分组id,appname:%s", appname));
        }
        XxlJobUtil.groupId = groupId;
    }

    /**
     * 修改执行时间
     * @param id 任务id
     * @param cron cron表达式
     * @return {@link String}
     * @author kritofgo
     * @date 2022/05/27 17:38
     **/
    public static String update(int id, String cron) {
        Map<String, Object> param = new HashMap<>(4);
        param.put("id", id);
        param.put("jobCron", cron);
        return doPost(adminAddresses + UPDATE_URL, param, String.class);
    }

    /**
     * 删除任务
     * @param id 任务id
     * @return {@link String}
     * @author kritofgo
     * @date 2022/05/27 17:39
     **/
    public static String remove(int id) {
        Map<String, Object> param = new HashMap<>(4);
        param.put("id", id);
        return doPost(adminAddresses + REMOVE_URL, param, String.class);
    }

    /**
     * 暂停任务
     * @param id 任务id
     * @return {@link String}
     * @author kritofgo
     * @date 2022/05/27 17:40
     **/
    public static String pause(int id) {
        Map<String, Object> param = new HashMap<>(4);
        param.put("id", id);
        return doPost(adminAddresses + PAUSE_URL, param, String.class);
    }

    /**
     * 开始任务
     * @param id 任务id
     * @return {@link String}
     * @author kritofgo
     * @date 2022/05/27 17:40
     **/
    public static String start(int id) {
        Map<String, Object> param = new HashMap<>();
        param.put("id", id);
        return doPost(adminAddresses + START_URL, param, String.class);
    }

    /**
     * 添加并启动
     * @param jobInfo 任务信息
     * @return {@link String}
     * @author kritofgo
     * @date 2022/05/27 20:10
     **/
    public static String addAndStart(XxlJobInfo jobInfo) {
        jobInfo.setJobGroup(groupId);
        return doPost(adminAddresses + ADD_AND_START_URL, jobInfo, String.class);
    }

    @SuppressWarnings("unchecked")
    public static <T> T doPost(String url, Object json, Class<T> clazz) {
        ReturnT<T> returnT = XxlJobRemotingUtil.postBody(url, accessToken, 3, json, clazz);
        if (returnT.getCode() != SUCCESS_CODE) {
            throw new XllJobRemoteException(String.format("【xxl-job】接口调用失败,错误码:%s,原因:%s",
                    returnT.getCode(), returnT.getMsg()));
        }
        return returnT.getContent();
    }

}

cron生成器的工具类

import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.Objects;

/**
 * @description:
 * @author kritofgo
 * @date 2022/8/10 14:08
 */
public class CronUtil {
    private static final SimpleDateFormat sdf = new SimpleDateFormat("ss mm HH dd MM ? yyyy");

    /**
     * 年 (可选) 留空
     * 允许的特殊字符:留空, 1970-2099 , - * /
     */
    private String year;
    /**
     * 星期 可以用数字1-7表示(1 = 星期日)或用字符口串“SUN, MON, TUE, WED, THU, FRI and SAT”表示
     * 允许的特殊字符:1-7 或者 SUN-SAT , - * ? / L C #
     */
    private String week;
    /**
     * 月  可以用0-11 或用字符串  “JAN, FEB, MAR, APR, MAY, JUN, JUL, AUG, SEP, OCT, NOV and DEC” 表示
     * 允许的特殊字符:1-12 或者 JAN-DEC , - * /
     */
    private String month;
    /**
     * 日 可以用数字1-31 中的任一一个值,但要注意一些特别的月份
     * 允许的特殊字符:1-31 , - * ? / L W C
     */
    private String day;
    /**
     * 时 可以用数字0-23表示
     * 允许的特殊字符:0-23, - * /
     */
    private String hour;
    /**
     * 分 可以用数字0-59 表示
     * 允许的特殊字符:0-59,- * /
     */
    private String minutes;
    /**
     * 秒 可以用数字0-59 表示
     * 允许的特殊字符:0-59,- * /
     */
    private String seconds ;

    /***
     *  日期转换cron表达式 例如 "0 07 10 15 1 ? 2016"
     * @param date 时间点
     * @return
     */
    public static String getCron(Date date) {
        String formatTimeStr = null;
        if (Objects.nonNull(date)) {
            formatTimeStr = sdf.format(date);
        }
        return formatTimeStr;
    }

    /**
     * 获取指定日期的cron表达式
     * @param year 年
     * @param week 星期 可以用数字1-7表示(1 = 星期日)或用字符口串“SUN, MON, TUE, WED, THU, FRI and SAT”表示
     * @param month 月 可以用0-11 或用字符串  “JAN, FEB, MAR, APR, MAY, JUN, JUL, AUG, SEP, OCT, NOV and DEC” 表示
     * @param day 日 可以用数字1-31 中的任一一个值,但要注意一些特别的月份
     * @param hour 时 可以用数字0-23表示
     * @param minutes 分 可以用数字0-59 表示
     * @param seconds 秒 可以用数字0-59 表示
     * @return
     */
    public static String getCron(String year,String week,String month,String day,String hour,String minutes,String seconds) {
        return seconds+" "+minutes+" "+hour+" "+day+" "+month+" "+week+" "+year;
    }

    /**
     * 获取指定日期的cron表达式
     * @param week 星期 可以用数字1-7表示(1 = 星期日)或用字符口串“SUN, MON, TUE, WED, THU, FRI and SAT”表示
     * @param month 月 可以用0-11 或用字符串  “JAN, FEB, MAR, APR, MAY, JUN, JUL, AUG, SEP, OCT, NOV and DEC” 表示
     * @param day 日 可以用数字1-31 中的任一一个值,但要注意一些特别的月份
     * @param hour 时 可以用数字0-23表示
     * @param minutes 分 可以用数字0-59 表示
     * @param seconds 秒 可以用数字0-59 表示
     * @return
     */
    public static String getCron(String week,String month,String day,String hour,String minutes,String seconds) {
        return getCron("*",week,month,day,hour,minutes,seconds);
    }

    /**
     * 获取指定日期的cron表达式
     * @param month 月 可以用0-11 或用字符串  “JAN, FEB, MAR, APR, MAY, JUN, JUL, AUG, SEP, OCT, NOV and DEC” 表示
     * @param day 日 可以用数字1-31 中的任一一个值,但要注意一些特别的月份
     * @param hour 时 可以用数字0-23表示
     * @param minutes 分 可以用数字0-59 表示
     * @param seconds 秒 可以用数字0-59 表示
     * @return
     */
    static String getCron(String month,String day,String hour,String minutes,String seconds) {
        return getCron("?",month,day,hour,minutes,seconds);
    }

    /**
     * 获取指定范围的Cron表达式 例如 13-14 30-31 11-12 20-21 04-05 1-2 2021-2022
     * @param year 年 使用(year1-year2) year1<=year2
     * @param week 星期 使用(week1-week2) 可以用数字1-7表示(1 = 星期日)或用字符口串“SUN, MON, TUE, WED, THU, FRI and SAT”表示
     * @param month 月 使用(month1-month2) 可以用0-11 或用字符串  “JAN, FEB, MAR, APR, MAY, JUN, JUL, AUG, SEP, OCT, NOV and DEC” 表示
     * @param day 日  使用(day1-day2) 可以用数字1-31 中的任一一个值,但要注意一些特别的月份
     * @param hour 时 使用(hour1-hour2) 可以用数字0-23表示
     * @param minutes 分  使用(minutes1-minutes2) 可以用数字0-59 表示
     * @param seconds 秒  使用(seconds1-seconds2) 可以用数字0-59 表示
     * @return
     */
    public static String getCronByRange(String year,String week,String month,String day,String hour,String minutes,String seconds) {
        return seconds+" "+minutes+" "+hour+" "+day+" "+month+" "+week+" "+year;
    }

    /**
     * 获取指定范围的Cron表达式 例如 13-14 30-31 11-12 20-21 04-05 1-2
     * @param week 星期 使用(week1-week2) 可以用数字1-7表示(1 = 星期日)或用字符口串“SUN, MON, TUE, WED, THU, FRI and SAT”表示
     * @param month 月 使用(month1-month2) 可以用0-11 或用字符串  “JAN, FEB, MAR, APR, MAY, JUN, JUL, AUG, SEP, OCT, NOV and DEC” 表示
     * @param day 日  使用(day1-day2) 可以用数字1-31 中的任一一个值,但要注意一些特别的月份
     * @param hour 时 使用(hour1-hour2) 可以用数字0-23表示
     * @param minutes 分  使用(minutes1-minutes2) 可以用数字0-59 表示
     * @param seconds 秒  使用(seconds1-seconds2) 可以用数字0-59 表示
     * @return
     */
    public static String getCronByRange(String week,String month,String day,String hour,String minutes,String seconds) {
        return getCron("*",week,month,day,hour,minutes,seconds);
    }

    /**
     * 获取指定范围的Cron表达式  例如 13-14 30-31 11-12 20-21 04-05
     * @param month 月 使用(month1-month2) 可以用0-11 或用字符串  “JAN, FEB, MAR, APR, MAY, JUN, JUL, AUG, SEP, OCT, NOV and DEC” 表示
     * @param day 日  使用(day1-day2) 可以用数字1-31 中的任一一个值,但要注意一些特别的月份
     * @param hour 时 使用(hour1-hour2) 可以用数字0-23表示
     * @param minutes 分  使用(minutes1-minutes2) 可以用数字0-59 表示
     * @param seconds 秒  使用(seconds1-seconds2) 可以用数字0-59 表示
     * @return
     */
    static String getCronByRange(String month,String day,String hour,String minutes,String seconds) {
        return getCron("?",month,day,hour,minutes,seconds);
    }
}

下面是项目中用到的代码示例:文章来源地址https://www.toymoban.com/news/detail-518150.html

...
 //执行器cron表达式
        String cron = CronUtil.getCron(wxSubscription.getReminderTime());
        log.info("当前cron表达式:----" + cron);
        //执行器任务参数,
        String mId = String.valueOf(wxSubscription.getId());
        //执行器,任务Handler名称
        String handler = "";
        String jobDesc = "秒杀活动订阅消息:" + wxSubscription.getId();
        XxlJobInfo jobInfo = new XxlJobInfo(jobDesc, "admin", handler, mId);
        jobInfo.setSchedule(ScheduleTypeEnum.CRON, cron);
        //创建定时任务提醒用户
        XxlJobUtil.addAndStart(jobInfo);
...

到了这里,关于动态创建xxl-job任务的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 【xxl-job】分布式任务调度系统xxl-job搭建

    XXL-JOB是一个轻量级分布式任务调度平台,其核心设计目标是开发迅速、学习简单、轻量级、易扩展、开箱即用。 更多介绍,请访问官网:分布式任务调度平台XXL-JOB 前提条件:任务调度中心(xxl-job admin)依赖于 mysql,所以必须要安装mysql才行!安装mysql有2种方式:docker部署或

    2024年02月16日
    浏览(50)
  • XXL-JOB任务分片

    单个任务:一个任务实例便可完成 单机单任务:单机模式下任何路由模式都只有一个实例执行 集群单任务:由路由策略(广播模式除外)选择其中一个实例完成 分片任务:集群部署,每个实例都同时执行一部分数据。分片方式:取模分片,范围分片 单机多任务分片:单机模式

    2024年02月08日
    浏览(60)
  • xxl-Job分布式任务调度

    我们可以先思考一下业务场景的解决方案: 某电商系统需要在每天上午10点,下午3点,晚上8点发放一批优惠券。 某银行系统需要在信用卡到期还款日的前三天进行短信提醒。 某财务系统需要在每天凌晨0:10结算前一天的财务数据,统计汇总。 12306会根据车次的不同,设置某

    2024年02月15日
    浏览(48)
  • 【分布式任务调度平台 XXL-JOB 急速入门】从零开始将 XXL-JOB 接入到自己的项目

                                    💧 分布式任务调度平台 X X L − J O B 急速入门:从零开始将 X X L − J O B 接入到自己的项目 color{#FF1493}{分布式任务调度平台 XXL-JOB 急速入门:从零开始将 XXL-JOB 接入到自己的项目} 分布式任务调度平台 XX L − J OB 急速入门:从零

    2024年02月14日
    浏览(47)
  • 分布式定时任务调度xxl-job

    Quartz中最重要的三个对象:Job(作业)、Trigger(触发器)、Scheduler(调度器)。 xxl-job的调度原理:调度线程在一个while循环中不断地获取一定数量的即将触发的Trigger,拿到绑定的Job,包装成工作线程执行。 当然,不管在任何调度系统中,底层都是线程模型。如果要自己写一个

    2024年03月10日
    浏览(56)
  • xxl-Job分布式任务调度 入门

    我们可以先思考一下业务场景的解决方案: 某电商系统需要在每天上午10点,下午3点,晚上8点发放一批优惠券。 某银行系统需要在信用卡到期还款日的前三天进行短信提醒。 某财务系统需要在每天凌晨0:10结算前一天的财务数据,统计汇总。 12306会根据车次的不同,设置某

    2024年02月03日
    浏览(106)
  • SpringCloud-搭建XXL-JOB任务调度平台教程

    XXL-JOB是一个轻量级分布式任务调度框架,旨在解决分布式系统中的任务调度问题,提高系统的处理效率和任务管理的便捷性。 1. XXL-JOB任务调度概念 XXL-JOB任务调度平台通过中心化管理方式,使得任务的调度更加高效和集中。平台不仅提供了丰富的任务调度功能,例如:CRON表

    2024年04月28日
    浏览(42)
  • 分布式定时任务-XXL-JOB-教程+实战

    1.定时任务认识 1.1.什么是定时任务 定时任务是按照指定时间周期运行任务。使用场景为在某个固定时间点执行,或者周期性的去执行某个任务,比如:每天晚上24点做数据汇总,定时发送短信等。 1.2.常见定时任务方案 While + Sleep : 通过循环加休眠的方式定时执行 Timer和Time

    2024年02月16日
    浏览(48)
  • XXL-JOB定时任务框架(Oracle定制版)

    xxl-job是一个轻量级、易扩展的分布式任务调度平台,能够快速开发和简单学习。开放源代码并被多家公司线上产品使用,开箱即用。尽管其确实非常好用,但我在工作中使用的是Oracle数据库,因为xxl-job是针对MySQL设计的,所以使用起来需要进行一些魔改。为了方便后人使用,

    2023年04月13日
    浏览(53)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包