首页 > 其他分享 >XXL-JOB 使用笔记(附代码)

XXL-JOB 使用笔记(附代码)

时间:2024-03-06 19:44:05浏览次数:28  
标签:job 笔记 JOB private xxlJobSpringExecutor import XXL com xxl

一: 分布式调度系统对比

开源产品对比: 0 Quartz 缺点:  1、不支持任务编排,无可视化编配页面  2、与业务高度耦合,系统侵入性严重  3.调度逻辑和QuartzJobBean耦合在同一个项目中,任务增加会导致系统性能瓶颈  4.quartz底层以“抢占式”获取DB锁并由抢占成功节点负责运行任务,会导致节点负载悬殊非常大

二、XXL-JOB 主要特征

1、介绍 一个轻量级分布式任务调度平台。 核心设计目标:开发迅速、学习简单、轻量级、易扩展 分布式任务调度的一体式解决方案,开箱即用。 2、主要特征     动态:---支持动态修改任务状态、启动/停止任务,以及终止运行中任务,即时生效     执行器HA(分布式):---任务分布式执行,任务”执行器”支持集群部署,可保证任务执行HA     弹性扩容缩容:---一旦有新执行器机器上线或者下线,下次调度时将会重新分配任务     路由策略:---包括:第一个、最后一个、轮询、随机、一致性HASH等     任务失败重试:---支持自定义任务失败重试次数     任务失败告警:---默认提供邮件方式失败告警,同时预留扩展接口,可方便的扩展短信、钉钉等告警方式     全异步:---任务调度流程全异步化设计实现,如异步调度、异步运行、异步回调等     跨语言:---调度中心与执行器提供语言无关的RESTful API服务,支持java/Python/Shell/PHP等等     权限控制:---执行器维度进行权限控制,管理员拥有全量权限,普通用户需要分配执行器权限后才允许相关操作  3、架构图

 

 

三、使用代码示例

1、引入maven依赖包
<dependency>
    <groupId>com.xuxueli</groupId>
    <artifactId>xxl-job-core</artifactId>
    <version>2.2.0</version>
</dependency>

 

2、配置文件中增加配置信息。 以nacos配置 为例:
xxl:
  job:
    admin:
      addresses:  http://127.0.0.1:8114/xxl-job-admin     // xxl服务注册地址
    executor:
      appname: myself-test-job            // 服务名称
      ip:                                 // 注册IP, 可以为空, 自动注册
      port: 9993                          // 注册端口号,
      address:                            // 注册地址,可为空
      logpath: D:\data/applogs/xxl-job/jobhandler            // xxl-job执行日志打印位置
      logretentiondays: 30                // 日志保留时长  30天    
    accessToken: R9F1w2jjTBPKeKjt         // xxl-job 校验token, 

 

3、项目中初始化配置信息
package com.jobs.conf;

import com.xxl.job.core.executor.impl.XxlJobSpringExecutor;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

/**
 * Created by Administrator  
 */
@Configuration
public class XxlJobConfig {
    private Logger logger = LoggerFactory.getLogger(XxlJobConfig.class);

    @Value("${xxl.job.admin.addresses}")
    private String adminAddresses;

    @Value("${xxl.job.accessToken}")
    private String accessToken;

    @Value("${xxl.job.executor.appname}")
    private String appname;

    @Value("${xxl.job.executor.address}")
    private String address;

    @Value("${xxl.job.executor.ip}")
    private String ip;

    @Value("${xxl.job.executor.port}")
    private int port;

    @Value("${xxl.job.executor.logpath}")
    private String logPath;

    @Value("${xxl.job.executor.logretentiondays}")
    private int logRetentionDays;

    @Bean
    public XxlJobSpringExecutor xxlJobExecutor() {
        logger.info(">>>>>>>>>>> xxl-job config init.");
        XxlJobSpringExecutor xxlJobSpringExecutor = new XxlJobSpringExecutor();
        xxlJobSpringExecutor.setAdminAddresses(adminAddresses);
        xxlJobSpringExecutor.setAppname(appname);
        xxlJobSpringExecutor.setAddress(address);
        xxlJobSpringExecutor.setIp(ip);
        xxlJobSpringExecutor.setPort(port);
        xxlJobSpringExecutor.setAccessToken(accessToken);
        xxlJobSpringExecutor.setLogPath(logPath);
        xxlJobSpringExecutor.setLogRetentionDays(logRetentionDays);

        return xxlJobSpringExecutor;
    }
}

 

4、使用
package com.jobs.jobs;

import com.xxl.job.core.biz.model.ReturnT;
import com.xxl.job.core.handler.IJobHandler;
import com.xxl.job.core.handler.annotation.XxlJob;
import com.xxl.job.core.log.XxlJobLogger;
import com.yd.jobs.service.MessageService;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Component;
import jakarta.annotation.Resource;

@Component
@Slf4j
public class SendMqXxl extends IJobHandler {     // 这里需要继承 IJobHandler   

    @Resource
    MessageService service;

    /**
     * @return xxljob 执行结果
     */
    @Override
    @XxlJob("scheduledSendMsg")      // 增加 @XxlJob 注解 
    public ReturnT<String> execute(String param) throws Exception {     // 返回值 固定ReturnT<String>
        try {
            log.info("同步开始 : {}", System.currentTimeMillis());
            service.scheduledSendMsg();    // 要执行的方法  
            XxlJobLogger.log("xxl-job, hello, param: {}", param);      // 这种日志打印,回将信息打印到执行日志中。 
            return ReturnT.SUCCESS;
        } catch (Exception e) {
            log.error("同步失败 : {}", e.getMessage());
            return ReturnT.FAIL;
        }
    }

}

 

四、调度中心配置

1、配置执行器 执行器管理 -> 新增 (注册方式:自动注册 机器地址可以自动发现) 0   任务管理 -> 新增 0 执行日志: 0   源码: https://gitee.com/xuxueli0323/xxl-job  

标签:job,笔记,JOB,private,xxlJobSpringExecutor,import,XXL,com,xxl
From: https://www.cnblogs.com/wgy1/p/18057394

相关文章

  • 线性代数——平面向量 学习笔记
    线性代数——平面向量学习笔记首发于洛谷。定义及用语说明无特殊说明,下文的向量均指自由向量且是平面向量。向量,英文名为vector,目前没有准确而统一的中文翻译。在物理学科,一般翻译成「矢量」,且与「标量」一词相对。在数学学科,一般直接翻译成「向量」。对于向量的乘法:......
  • Vue学习笔记3--组件嵌套
    组件嵌套示例一:<!DOCTYPEhtml><htmllang="en"><head><metacharset="UTF-8"><metaname="viewport"content="width=device-width,initial-scale=1.0"><title>非单文件组件--全局注册</tit......
  • NGUI学习笔记4.0
    EventListener和EventTrigger控件自带组件的局限性其实我们常见的复合控件只提供一些简单的事件监听,如按钮有点击抬起的监听,对长按等其他交互方式的事件监听不大支持。NGUI的监听函数给NGUI对象添加Collider,在其挂载的脚本中编写对应的NGUI的函数,在运行时候会通过反射来进行匹......
  • Mybatis学习笔记
    Mybatis代码Mybatis入门https://mybatis.net.cn/getting-started.html写一个Mybatis项目1、新建一个Maven项目2、导入依赖集<!--导入依赖--><dependencies><!--mysql驱动--><dependency><groupId>mysql</groupId>......
  • pandas笔记(二)-- 从不订购的顾客 (数据表连接,主键与外键)
    题目描述找出所有从不点任何东西的顾客,以任意顺序返回结果测试用例输入Customerstable:idname1Joe2Henry3Sam4MaxOrderstable:idcustomerId1321输出CustomersHenryMax解析数据表连接的问题核心在于连接......
  • 数位DP 学习笔记
    什么是数位DP数位dp是与数字相关的一类计数问题。这这类问题中,一般给定一些限制条件,求满足第\(K\)小的数是多少,或者求区间\([L,R]\)内有多少个满足条件的数。本文主要讲述如何解决求区间\([L,R]\)内有多少个满足条件的数这一类问题。为什么要用数位dp对于上述问题,如果......
  • SimGRACE论文阅读笔记
    Abstract​ 图对比学习(GCL)已经成为图表示学习的一种主导技术,它最大限度地提高了共享相同语义的成对图增强之间的互信息。不幸的是,由于图数据的多样性,在扩充过程中很难很好地保存语义。目前,GCL的数据扩充大致可分为三种不令人满意的方式。第一,可以通过试错法手动选择每个数据集的......
  • pandas笔记(一)-- 大的国家(逻辑索引、切片)
    题目描述如果一个国家满足下述两个条件之一,则认为该国是大国:面积至少为300万平方公里人口至少为2500万编写解决方案找出大国的国家名称、人口和面积按任意顺序返回结果表,如下例所示测试用例输入:namecontinentareapopulationgdpAfghanistanAsia65223......
  • Java学习笔记——第七天
    面向对象编程(ObjectOrientedProgramming,OOP)基础面向过程编程开发一个一个的方法,有数据要处理了,我们就调方法来处理。此时程序类似于流水线,按照代码自上而下依次运行。面向对象编程开发一个一个的对象来处理数据,把数据交给对象,再调用对象的方法来完成对数据的处理。程序在对......
  • Rust笔记(上)
    Rust笔记(上)目录Rust笔记(上)关于为什么最终还是选择了Rust作为主力语言基本数据类型所有权与移动所有权移动注意Rc与Arc:共享所有权引用共享引用可变引用生命周期省略生命周期表达式块与分号声明if与matchiflet循环break错误处理panicResult自定义错误类型结构体泛型结构体结构体自......