• 【xxl-job】轻松实现分布式定时任务demo实例


    【项目描述】
    前段时间专门独立了一个spring boot服务,用于做和第三方erp系统的对接工作。此服务的第一个需求工作就是可以通过不同的规则,设置不同的定时任务,从而获取erp系统的商品数据。所以,系统架构采用了xxl-job实现分布式定时任务。

    【学习背景】
    此项目不是我负责的,在上个月同事让我帮忙处理一个问题,便带给了我学习的机会,这个框架已经在线上环境使用,但框架也不是我参与搭建的,所以还是找到官方文档和项目实例,积累下技术与项目经验。本篇博客是一个简单的demo实例,主要总结下如何将此框架与我们的项目结合。

    【实例搭建】
    初始化“调度数据库”
    下载项目源码,获取“调度数据库初始化SQL脚本”,正常情况下生成16张表。
    sql脚本位置: /xxl-job/doc/db/tables_xxl_job.sql
    项目源码地址:https://github.com/xuxueli/xxl-job
    在IDEA中,我们可以直接选择通过github地址新建项目:


    配置部署“调度中心"
    调度中心配置文件地址:
    /xxl-job/xxl-job-admin/src/main/resources/xxl-job-admin.properties
    我们只需要将数据库连接配置修改成自己的环境:


    部署项目
    正确进行上述配置后,我们可将项目编译打war包部署到tomcat中。调度中心访问地址:http://localhost:8080/xxl-job-admin (默认8080端口,该地址执行器将会使用到,作为回调地址)
    我使用的是IDEA中Smart Tomcat部署的项目:

    部署成功的话,你可以看到如下界面:


    使用管理系统,在“任务管理"中,新建一个定时任务,填写好相关的配置信息


    使用管理系统,在“执行器管理”中配置一个执行器,也就是我们的项目中需要用到的


    至此,调度中心的部署和配置工作结束了。下面是将此配置与我们的项目结合。只是一个demo实例,我就新建了一个spring boot框架项目,加入xxl-job框架搭建步骤如下:

    1.项目加入maven依赖

    <!-- http://repo1.maven.org/maven2/com/xuxueli/xxl-job-core/ -->
    <dependency>
    <groupId>com.xuxueli</groupId>
    <artifactId>xxl-job-core</artifactId>
    <version>1.9.1</version>
    </dependency>
    

      

    2.xxlJobConfig配置类

    @Slf4j
    @Configuration
    //扫描定时任务设置包路径
    @ComponentScan(basePackages = "com.uqiauto.springbootxxljob.job")
    public class XxlJobConfig {
    
    @Value("${xxl.job.admin.address}")
    private String adminAddresses;
    
    @Value("${xxl.job.executor.appname}")
    private String appName;
    
    @Value("${xxl.job.alarmEmail}")
    private String alarmEmail;
    
    @Value("${xxl.job.executor.ip}")
    private String ip;
    
    @Value("${xxl.job.executor.port}")
    private int port;
    
    @Value("${xxl.job.accessToken}")
    private String accessToken;
    
    @Value("${xxl.job.executor.logpath}")
    private String logPath;
    
    @Value("${xxl.job.executor.logretentiondays}")
    private int logRetentionDays;
    
    @Bean(initMethod = "start", destroyMethod = "destroy")
    public XxlJobExecutor xxlJobExecutor() {
    log.info(">>>>>>>>>>> xxl-job config init.");
    XxlJobExecutor xxlJobExecutor = new XxlJobExecutor();
    xxlJobExecutor.setAdminAddresses(adminAddresses);
    xxlJobExecutor.setAppName(appName);
    xxlJobExecutor.setIp(ip);
    xxlJobExecutor.setPort(port);
    xxlJobExecutor.setAccessToken(accessToken);
    xxlJobExecutor.setLogPath(logPath);
    xxlJobExecutor.setLogRetentionDays(logRetentionDays);
    
    return xxlJobExecutor;
    }
    
    public String getAdminAddresses() {
    return adminAddresses;
    }
    
    public String getAppName() {
    return appName;
    }
    
    public String getIp() {
    return ip;
    }
    
    public int getPort() {
    return port;
    }
    
    public String getAccessToken() {
    return accessToken;
    }
    
    public String getLogPath() {
    return logPath;
    }
    
    public int getLogRetentionDays() {
    return logRetentionDays;
    }
    
    public String getAlarmEmail() {
    return alarmEmail;
    }
    }
    

      


    3.定时任务设置demo job

    /**
    * 任务Handler示例(Bean模式)
    *
    * 开发步骤:
    * 1、继承"IJobHandler":“com.xxl.job.core.handler.IJobHandler”;
    * 2、注册到Spring容器:添加“@Component”注解,被Spring容器扫描为Bean实例;
    * 3、注册到执行器工厂:添加“@JobHandler(value="自定义jobhandler名称")”注解,注解value值对应的是调度中心新建任务的JobHandler属性的值。
    * 4、执行日志:需要通过 "XxlJobLogger.log" 打印执行日志;
    *
    * @author xuxueli 2015-12-19 19:43:36
    */
    @JobHandler(value="demoJobHandler")
    @Component
    public class DemoJobHandler extends IJobHandler {
    
    @Override
    public ReturnT<String> execute(String param) throws Exception {
    XxlJobLogger.log("XXL-JOB, Hello World.");
    
    for (int i = 0; i < 5; i++) {
    XxlJobLogger.log("beat at:" + i);
    TimeUnit.SECONDS.sleep(2);
    }
    
    return SUCCESS;
    }
    
    }
    

      

    4.项目中配置xxl-job框架需要用到的信息

    xxl.job:
    admin.address: http://localhost:8088/xxl-job-admin/
    accessToken:
    alarmEmail: 18333617859@163.com
    executor:
    appname: xxl-job-executor-sample
    ip:
    port: 9999
    logpath: /data/applogs/xxl-job/jobhandler
    #执行器Log文件定期清理功能,指定日志保存天数,日志文件过期自动删除。限制至少保持3天,否则功能不生效;
    logretentiondays: -1
    

      

    至此,整个搭建步骤就完成了。我设置的定时任务是每小时执行一次,同时也支持我们在管理系统页面去手动执行,最终我们可以通过管理系统去查看到定时任务执行的相关日志信息:


    每条日志的详细信息:


    【学习总结】
    本篇博客只是一个简单的教程,将xxl-job分布式定时任务框架结合到一个spring boot 项目中,后面还会深入学习此分布式定时任务框架的其他知识,将此分布式定时任务框架与其他框架进行对比学习。

  • 相关阅读:
    解析ASP.NET WebForm和Mvc开发的区别
    relink:在Linux/UNIX平台上relink Oracle软件(转)
    Java开发 Eclipse使用技巧(转)
    职场人生:情商
    RPC
    PLSQL Developer Debug
    uC/OS-III学习2::uC/OS-III LED闪烁实验
    Flex文件读取报错
    C++字节对齐问题
    写可測试的代码
  • 原文地址:https://www.cnblogs.com/yuyu666/p/10063751.html
Copyright © 2020-2023  润新知