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

一: 分布式调度系统对比

开源产品对比:
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
 
posted @ 2024-03-06 19:39  currentTimeMillis  阅读(14)  评论(0编辑  收藏  举报