美文网首页springcloud
Spring Cloud集成任务调度中心

Spring Cloud集成任务调度中心

作者: 赵哥窟 | 来源:发表于2022-06-23 13:51 被阅读0次

    一、使用背景

    目前项目中,采用的是微服务框架,由于在微服务中,存在需要定时的任务。但如果定时任务维护在每个微服务下,当微服务部署多个实例的情况下,会出现定事任务多次执行的情况。并且在解决问题的基础上,希望能够实现动态修改任务的定时时间,可以通过页面对定时任务进行控制。

    二、xxl-job简单介绍

    首先,xxl-job是一个轻量级分布式任务调度平台,内容采用了Quartz定时框架实现,服务之间通信通过RPC的方式实现。

    其次,在功能方面:

    1. 支持通过web页面对任务进行增删改查操作
    2. 支持动态修改任务状态、启动、停止等,即时生效。
    3. 支持多种阻塞处理策略,如串行、丢弃后续调度、覆盖之前调度
    4. 支持超时控制、失败重试、邮件报警等处理

    三、服务端实现过程

    1、xxl-job源码下载:

    github地址:https://github.com/xuxueli/xxl-job

    其中,xxl-job-core为核心代码块,xxl-job-admin为任务调度中心管理模块,部署的话,部署xxl-job-admin即可。

    2、数据库创建:

    sql文件为:xxl-job/doc/db/tables_xxl_job.sql,在mysql数据库中执行该sql,能生成新的数据库xxl-job及相关的数据库表xxl_job_*。

    目前从源码来看,暂时只支持mysql数据库,如需支持其他数据库,可在源码上进行相关的修改:如mybatis的配置、sql语句等。

    3、xxl-job-admin模块配置修改:

    修改xxl-job-admin下的配置文件:application.properties

    在配置文件中,主要需要修改数据库地址(spring.datasource.url)、用户名(spring.datasource.username)、密码的配置(spring.datasource.password)为实际的部署环境。

    端口号(server.port)默认为8080,可修改。

    访问地址(server.context-path)默认为xxl-job-admin,可修改。

    4、启动xxl-job-admin微服务:

    启动成功后,可通过访问http://localhost:8080/xxl-job-admin来对任务调度中心进行访问。

    用户名密码默认为:admin/123456

    四、客户端(微服务模块)实现过程:

    1、引用依赖:

    pom.xml中,增加依赖:

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

    2、修改配置文件:

    #xxl-job 配置
    xxl.job.admin.addresses=http://localhost:9094/xxl-job-admin/
    xxl.job.executor.port=9008
    xxl.job.executor.appName=project-b-job
    xxl.job.executor.logpath=./data/applogs/xxl-job/jobhandler
    xxl.job.executor.logretentiondays=30
    xxl.job.accessToken=default_token
    

    其中ip可不填,会自动识别注册。

    3、编写Configuration类

    import com.xxl.job.core.executor.impl.XxlJobSpringExecutor;
    import org.springframework.beans.factory.annotation.Value;
    import org.springframework.context.annotation.Bean;
    import org.springframework.context.annotation.Configuration;
    
    @Configuration
    public class XxlJobConfig {
    
        @Value("${xxl.job.admin.addresses}")
        private String adminAddresses;
    
        @Value("${xxl.job.executor.appName}")
        private String appName;
    
        @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;
    
        private int logRetentionDays=-1;
    
        @Bean(initMethod = "start", destroyMethod = "destroy")
        public XxlJobSpringExecutor xxlJobExecutor() {
            System.out.println(">>>>>>>>>>> xxl-job config init.");
            XxlJobSpringExecutor xxlJobSpringExecutor = new XxlJobSpringExecutor();
            xxlJobSpringExecutor.setAdminAddresses(adminAddresses);
            xxlJobSpringExecutor.setAppname(appName);
            xxlJobSpringExecutor.setIp(ip);
            xxlJobSpringExecutor.setPort(port);
            xxlJobSpringExecutor.setAccessToken(accessToken);
            xxlJobSpringExecutor.setLogPath(logPath);
            xxlJobSpringExecutor.setLogRetentionDays(logRetentionDays);
    
            return xxlJobSpringExecutor;
        }
    }
    
    

    4、编写测试类

    代码如下所示:

    @Component
    public class ScheduleJob {
        @Resource
        OrderMainMapper orderMainMapper;
    
        @XxlJob("scheduleJobTest")
        public void scheduleJobTest(){
            OrderMain orderMain = new  OrderMain();
            orderMain.setOrderId((int) System.currentTimeMillis());
            orderMain.setUserId(1);
            orderMain.setGoodsName("商品"+new Random().nextInt());
            orderMain.setOrderAmount(new BigDecimal(new Random().nextInt(1000)));
            orderMain.setShopName("店铺"+new Random().nextInt());
            orderMainMapper.insert(orderMain);
        }
    }
    

    在上面代码中,Handler的命名为“ scheduleJobTest”,此命名需要是唯一的,后续再服务器中配置会用到。

    5、启动客户端(微服务):

    启动成功后,会自动在服务器中,增加一个名为【project-b-job】的执行器,用来执行定时任务。

    五、服务器端页面中进行配置:

    1、新增执行器

    访问服务器页面登录成功后,点击执行器管理,如图:


    截屏2022-06-23 13.46.17.png

    新增一个执行器


    截屏2022-06-23 13.47.07.png

    2、新增任务

    点击【任务管理】页签【新增】按钮,执行器选择 执行器测试,JobHandler编写为【scheduleJobTest】,Cron为定时计划,如图所示:


    截屏2022-06-23 13.49.06.png

    保存后,可点击【执行】按钮,查看是否调用了客户端的Handler处理。在此不再演示。如可执行,则点击【启动】按钮,会在定时计划内,再次调用Handler处理。

    xxl-job 集群

    1.在xxl-job-executor.properties中,配置执行器ip时我们不进行ip的配置,使其为空,当其为空时,执行器便会自动寻找宿主机的ip。

    2.调度中心新增执行器时,注册方式选择自动,这是的appName一定要跟xxl-job-executor.properties配置一直,这是调度中心可以访问到执行器的关键。

    image.png

    3.任务的轮询方式也不在单一了,我们可以使用轮询,忙碌转移,故障转移等方式。

    image.png

    4.数据库配置保持一致

    5.登录账号保持一致

    6.路由策略主要还是轮询

    相关文章

      网友评论

        本文标题:Spring Cloud集成任务调度中心

        本文链接:https://www.haomeiwen.com/subject/aszpvrtx.html