XXL-JOB任务调度

news2024/9/28 15:20:01

简介:
XXL-JOB 是一个分布式任务调度平台,其核心设计目标是开发迅速、学习简单、轻量级、易扩展。
官网:https://www.xuxueli.com/xxl-job/

以下业务场景可用任务解决

  • 某电商平台需要每天上午10点,下午3点,晚上8点发放批优惠券
  • 某银行系统需要在信用卡到期还款日的前三天进行短信提醒
  • 某财务系统需要在每天凌晨0:10分结算前一天的财务数据,统计汇总

为什么要使用任务调用

使用spring的 @Schedule 也能完成调度的功能(在启动类上贴上@EnableSchedule注解)

    @Scheduled(cron = "0/3 * * * * ?")
    public void work(){
        //dosomething
    }

1、单点故障:单机版的定时任务调度只能在一台机器上运行,如果程序出现异常导致功能不能用。
2、防止重复执行:多台服务器任务时间统一控制,防止出现重复执行和混乱。
3、提高效率:单机即使使用多线程、多进程,其吞吐量也会受到cpu、内存、磁盘、带宽等的影响。所以集群是有必要的。
在这里插入图片描述

快速开始

在这里插入图片描述

任务调度中心

1、下载项目
通过git拉去项目(https://gitee.com/xuxueli0323/xxl-job)
2、初始化数据库
执行 doc\db 下的sql文件。
在这里插入图片描述
3、修改调度中心配置文件
打开下载的项目文件,修改properties文件(项目端口、数据库信息)。
在这里插入图片描述
4、启动调度中心
首次访问(http://localhost:8080/xxl-job-admin/)需要输入账号密码admin 123456

在这里插入图片描述

执行器

1、 新建springboot项目,jdk11,勾选 spring web 依赖。
2、添加xxl-job依赖

<dependency>
            <groupId>com.xuxueli</groupId>
            <artifactId>xxl-job-core</artifactId>
            <version>2.3.1</version>
</dependency>

3、编写properties文件

server.port=8888

# 调度中心部署根地址[选填](集群则用逗号隔开)。执行器会使用该地址进行“执行器心跳注册”和“任务结果回调”
xxl.job.admin.addresses=http://127.0.0.1:8080/xxl-job-admin
# 执行器通讯token[选填]非空时使用
xxl.job.accessToken=default_token
# 执行器AppName[选填]:执行器心跳注册分组依据,为空时关闭自动注册
xxl.job.executor.appname=xxl-job-executor-sample
# 执行器注册地址[选填]:优先使用,为空时使用内嵌服务“ip:port”作为注册地址
xll.job.executor.address=
# 执行器ip[选填]:默认为空则表示自动获取ip,多网卡时可以手动设置指定ip
xll.job.executor.ip=127.0.0.1
# 执行器端口[选填]:默认为9999
xxl.kob.executor.port=9999
# 执行器日志文件保存路径[选填],为空默认路径
xxl.job.executor.logpath=
# 日志保存天数
xxl.job.executor.logretentiondays=30

4、在配置类中创建 XxlJobSpringExecutor 对象,引入配置文件中的属性。

@Configuration
public class XxlJobConfig {
    @Value("${xxl.job.admin.addresses}")
    private String adminAddress;
    @Value("${xxl.job.accessToken}")
    private String accessToken;
    @Value("${xxl.job.executor.appname}")
    private String appname;
    @Value("${xll.job.executor.address}")
    private String address;
    @Value("${xll.job.executor.ip}")
    private String ip;
    @Value("${xxl.kob.executor.port}")
    private int port;
    @Value("${xxl.job.executor.logpath}")
    private String logPath;
    @Value("${xxl.job.executor.logretentiondays}")
    private int logRetentionDays;

    @Bean
    public XxlJobSpringExecutor xxlJobSpringExecutor(){
        XxlJobSpringExecutor xxlJobSpringExecutor = new XxlJobSpringExecutor();
        xxlJobSpringExecutor.setAdminAddresses(adminAddress);
        xxlJobSpringExecutor.setAccessToken(accessToken);
        xxlJobSpringExecutor.setAppname(appname);
        xxlJobSpringExecutor.setAddress(address);
        xxlJobSpringExecutor.setIp(ip);
        xxlJobSpringExecutor.setPort(port);
        xxlJobSpringExecutor.setLogPath(logPath);
        xxlJobSpringExecutor.setLogRetentionDays(logRetentionDays);
        return xxlJobSpringExecutor;
    }
}

5、书写业务类,实现具体的任务方法(使用@XxlJob注解声明处理器)。

    @XxlJob("demoJobHandler")
    public void demoJobHandler()throws Exception{
        System.out.println("执行定时任务:执行时间:"+ new Date());
    }

6、启动执行,在调度中心中可查看执行器信息
在这里插入图片描述

7、编写cron表达式,然后在操作中点击执行则可以启动任务。通过JobHandler中的名称找到一致名称@XxlJob注解多代表的方法
在这里插入图片描述
在这里插入图片描述

GLUE模式

不需要指定Handler,原理就是在任务调度中心中编写代码,然后将代码发送至执行器,执行器执行。这里使用了@Autowired、@Resource等注解。

1、点击新增,在运营模式中选择GLUE(java)。
2、在编写GLUE代码(注意引用相关包)
在这里插入图片描述

package com.xxl.job.service.handler;

import com.xxl.job.core.context.XxlJobHelper;
import com.xxl.job.core.handler.IJobHandler;
import org.springframework.beans.factory.annotation.Autowired;
import com.linxi.xxljob_demo.service.HelloService;

public class DemoGlueJobHandler extends IJobHandler {
    @Autowired
    private HelloService helloService;
    @Override
    public void execute() throws Exception {
        helloService.methedA();
    }
}

分片广播

将任务下发给所有执行器,执行器条件过滤选择自己的任务进行执行。并行 => 提高吞吐量。
分片任务场景:10个执行器的集群来处理10w条数据,每台机器只需要处理1w条数据,耗时降低10倍;

int shardIndex = XxlJobHelper.getShardIndex();
int shardTotal = XxlJobHelper.getShardTotal();
index:当前分片序号(从0开始),执行器集群列表中当前执行器的序号;
total:总分片数,执行器集群的总机器数量;
    @XxlJob("sendMsg")
    public void sendMsg() throws Exception {
        int shardIndex = XxlJobHelper.getShardIndex();//获取当前分片的序号
        int shardTotal = XxlJobHelper.getShardTotal();//分片总数
        if (shardTotal == 1) {
            //TODO 只有一个执行器
        } else {
            //TODO 多个执行器并行分发任务并行开始
            /*
            select * from table m
            where m.id % #{shareTotal} = #{shareIndex}
            limit #{count}
             */
        }
    }

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/688149.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

2023 高质量 Java 面试题集锦:高级 Java 工程师面试八股汇总

人人都想进大厂&#xff0c;当然我也不例外。早在春招的时候我就有向某某某大厂投岗了不少简历&#xff0c;可惜了&#xff0c;疫情期间都是远程面试&#xff0c;加上那时自身也有问题&#xff0c;导致屡投屡败。突然也意识到自己肚子里没啥货&#xff0c;问个啥都是卡卡卡卡&a…

炫技亮点 Websocket集群解决方案汇总

文章目录 问题方案方案一&#xff1a;~~Session共享~~&#xff08;不可行&#xff09;方案二&#xff1a;负载均衡器&#xff08;状态路由&#xff09;方案三&#xff1a;广播机制&#xff08;异步方式 - 建议&#xff09;方案四&#xff1a;路由转发&#xff08;同步方式&…

【JS经验分享】你真的会写JS吗?满满干货,建议读三遍(2)

大家好&#xff0c;最近准备总结一下JS的经验&#xff0c;分享分享&#xff0c;有不对的欢迎讨论哈~ JS作为前端的基础技能&#xff0c;每一位前端开发都要运用熟练&#xff0c;但你真的会写JS吗&#xff1f;js全称JavaScript&#xff0c;是运行在浏览器上的脚本语言&#xff0…

【高危】Nuxt.js <3.4.3 远程代码执行漏洞(POC公开)

漏洞描述 Nuxt.js(简称 Nuxt)是一个基于 Vue.js 的通用应用框架&#xff0c;用于构建服务端渲染的应用程序&#xff08;SSR&#xff09;和静态生成的网站。 Nuxt.js 3.4.3之前版本中的 test-component-wrapper 组件的动态导入函数存在代码注入漏洞&#xff0c;当服务器在开发…

Java集合流式编程

一、简介 1、什么是集合流式编程 集合流式编程&#xff08;Stream API&#xff09;是Java 8引入的一个功能强大的特性&#xff0c;它提供了一种更简洁、更高效的方式来操作集合数据。它的设计目标是让开发者能够以一种更声明式的风格来处理集合数据&#xff0c;减少了显式的迭…

Ubuntu部署jmeter与ant

为了整合接口自动化的持续集成工具&#xff0c;我将jmeter与ant都部署在了Jenkins容器中&#xff0c;并配置了build.xml 一、ubuntu部署jdk 1&#xff1a;先下载jdk-8u74-linux-x64.tar.gz&#xff0c;上传到服务器&#xff0c;这里上传文件用到了ubuntu 下的 lrzsz。 ubunt…

WordPress 备份插件 BackUpWordPress

WordPress备份是一件必不可少的事情&#xff0c;毕竟自己辛辛苦苦花了很多时间精力写得博客&#xff0c;经验总结&#xff0c;必须保留传承。WordPress备份可以在发生灾难性情况&#xff08;比如劫持或意外锁定&#xff09;下迅速恢复&#xff0c;确保了网站安全。 BackUpWord…

揭示不断增长的预切蔬菜市场:深入研究行业驱动因素和挑战

随着现代社会的快节奏和人们生活压力的增加&#xff0c;越来越多的人选择预制菜作为饮食解决方案&#xff0c;预制菜已经成为餐饮行业的新兴赛道。预制菜的优点包括方便快捷、卫生安全、节省时间、质量可靠&#xff0c;以及丰富的菜品选择和灵活的烹饪和食用方式&#xff0c;满…

基于SpringCloud微服务流动资金贷款业务系统设计与实现

一、引言 由于传统的贷款业务系统并不能够顺应时代的变化,同时在一定程度上对业务发展进行了限制,所以为了适应时代的发展,信息贷款业务应该能够被产品化、丰富化,同时还需要制定一套特定的流程来满足新时代用户的需求。流程化的规范管理是当今银行业务发展的必然趋势,研究并开…

基于Stable Diffusion的2D游戏关卡生成【实战】

接下来的几篇文章将与常规主题有所不同&#xff08;这是在从事通用机器人技术的职业中吸取的教训&#xff09;。 相反&#xff0c;我决定利用我的一些新空闲时间 1 边做边学&#xff0c;并使用所有酷孩子都在谈论的一些很酷的新 ML。 推荐&#xff1a;用 NSDT设计器 快速搭建可…

分割回文串-ii

分割回文串-ii 题目链接&#xff1a;分割回文串-ii 思路&#xff1a;分割字符串s&#xff0c;使得子串都是回文串&#xff0c;最后获得最小分割次数。那么我们可以不断把字符串缩短&#xff0c;判断子串是否可以被分割成回文串&#xff0c;并且最小分割次数。这就是子问题分割…

贝叶斯算法人生

哈喽大家好&#xff0c;我是咸鱼 之前看到过耗子叔写的一篇文章《程序算法与人生选择》&#xff0c;这篇文章中耗子叔结合计算机中的经典算法&#xff08;排序、动态规划等等&#xff09;&#xff0c;让大家在人生道路的选择上获得了一些启发 我最近看了一些关于贝叶斯思想的…

StringBuilder和StringBuffer

StringBuilder和StringBuffer 目录 StringBuilder和StringBuffer特点常见方法练习&#xff1a;测试字符串连接StringBuilder和StringBuffer的区别 特点 封装了char[]数组 是可变的字符序列 提供了一组可以对字符内容修改的方法 常用append()来代替字符串做字符串连接”” 内部…

智慧文旅VR全景展示,深度VR沉浸式体验

导语&#xff1a; 智慧文旅VR全景展示为我们带来了一种独特的旅行体验&#xff0c;让我们可以穿越时空、身临其境地感受历史、艺术和自然的魅力。 在这个数字化时代&#xff0c;智慧文旅VR全景展示成为了旅游界的新宠&#xff0c;它让我们能够以一种前所未有的方式探索世界&am…

看完这篇 教你玩转渗透测试靶机vulnhub—Corrosion:2

Vulnhub靶机Corrosion:2渗透测试详解 Vulnhub靶机介绍&#xff1a;Vulnhub靶机下载&#xff1a;Vulnhub靶机安装&#xff1a;Vulnhub靶机漏洞详解&#xff1a;①&#xff1a;信息收集&#xff1a;②&#xff1a;Tomcat msf 上传漏洞拿到shell&#xff1a;③&#xff1a;look越权…

何时使用Kafka而不是RabbitMQ

Kafka 和 RabbitMQ 都是流行的开源消息系统&#xff0c;它们可以在分布式系统中实现数据的可靠传输和处理。Kafka 和 RabbitMQ 有各自的优势和特点&#xff0c;它们适用于不同的场景和需求。本文将比较 Kafka 和 RabbitMQ 的主要区别&#xff0c;并分析何时使用 Kafka 而不是 R…

独立商城系统开发功能注意事项有哪些?

电商行业的不断发展&#xff0c;越来越多的企业开始构建自己的独立商城系统&#xff0c;以满足消费者日益增长的需求。然而&#xff0c;在开发独立商城系统时&#xff0c;需要注意什么样的功能才能使其成为一个成功的电商平台呢&#xff1f;下面我们就来谈一谈独立商城系统开发…

【C++ 程序设计】第 8 章:文件操作

目录 一、文件基本概念和文件流类 &#xff08;1&#xff09;文件的概念 &#xff08;2&#xff09;C 文件流类 二、打开和关闭文件 &#xff08;1&#xff09;打开文件 &#xff08;2&#xff09;关闭文件 三、文件读写操作 &#xff08;1&#xff09;读写文本文件…

软件测试工程师的那些经验分享

前几天&#xff0c;一个朋友去面软件测试工程师的职位了&#xff0c;回来还信心满满的跟我诉说自己的面试经历。然而&#xff0c;最后这个面试扑街了。其实我早就料到了…… 在面试这个环节&#xff0c;很多细节如果处理不好&#xff0c;最后就会凉凉&#xff0c;无论你软件测…

《名侦探柯南》所有主题曲名字

《名侦探柯南》所有主题曲名字列表&#xff1a; 1.第1-30集&#xff1a;心中动荡不安 2.第21-52集&#xff1a;Feel Your Heart 3.第53-96集&#xff1a;谜 4.第97-123集&#xff1a;转动命运之轮 5.第124-142集&#xff1a;真相究明 6.第143-167集&#xff1a;情义之印 7.第16…