经验首页 前端设计 程序设计 Java相关 移动开发 数据库/运维 软件/图像 大数据/云计算 其他经验
当前位置:技术经验 » Java相关 » Spring Boot » 查看文章
Spring boot下,集成任务调度中心(XXL-JOB)
来源:cnblogs  作者:#coder  时间:2019/6/6 9:21:42  对本文有异议

一、使用背景

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

二、XXL-JOB简单介绍

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

  其次,在功能方面:

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

  详情可参考官方网站:http://www.xuxueli.com/xxl-job

三、服务端实现过程

  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中,增加依赖:

  1. <dependency>
  2. <groupId>com.xuxueli</groupId>
  3. <artifactId>xxl-job-core</artifactId>
  4. <version>2.0.2</version>
  5. </dependency>

 

  2、修改配置文件:

    本文采用yml配置文件,增加配置如下:

  1. xxl:
  2. job:
  3. admin:
  4. addresses: http://localhost:8080/xxl-job-admin
  5. executor:
  6. ip:
  7. port: 9999
  8. logpath: /data/applogs/xxl-job/jobhandler
  9. appname: plat-job
  10. accessToken:

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

  3、编写Configuration类

    此处需要注意版本差异,由于服务器端采用的是V2+,客户端也需要采用V2+。不然会有异常。

    V2+的配置类代码如下:

  1. import com.xxl.job.core.executor.impl.XxlJobSpringExecutor;
  2. import org.springframework.beans.factory.annotation.Value;
  3. import org.springframework.context.annotation.Bean;
  4. import org.springframework.context.annotation.Configuration;
  5. @Configuration
  6. public class XxlJobConfig {
  7. @Value("${xxl.job.admin.addresses}")
  8. private String adminAddresses;
  9. @Value("${xxl.job.executor.appname}")
  10. private String appName;
  11. @Value("${xxl.job.executor.ip}")
  12. private String ip;
  13. @Value("${xxl.job.executor.port}")
  14. private int port;
  15. @Value("${xxl.job.accessToken}")
  16. private String accessToken;
  17. @Value("${xxl.job.executor.logpath}")
  18. private String logPath;
  19. private int logRetentionDays=-1;
  20. @Bean(initMethod = "start", destroyMethod = "destroy")
  21. public XxlJobSpringExecutor xxlJobExecutor() {
  22. System.out.println(">>>>>>>>>>> xxl-job config init.");
  23. XxlJobSpringExecutor xxlJobSpringExecutor = new XxlJobSpringExecutor();
  24. xxlJobSpringExecutor.setAdminAddresses(adminAddresses);
  25. xxlJobSpringExecutor.setAppName(appName);
  26. xxlJobSpringExecutor.setIp(ip);
  27. xxlJobSpringExecutor.setPort(port);
  28. xxlJobSpringExecutor.setAccessToken(accessToken);
  29. xxlJobSpringExecutor.setLogPath(logPath);
  30. xxlJobSpringExecutor.setLogRetentionDays(logRetentionDays);
  31. return xxlJobSpringExecutor;
  32. }
  33. }

 

  4、编写Handler类(实际处理任务):  

    代码如下所示:

 import com.xxl.job.core.biz.model.ReturnT;
 import com.xxl.job.core.handler.IJobHandler;
 import com.xxl.job.core.handler.annotation.JobHandler;

  1. @JobHandler(value="TestHandler")
  2. @Component
  3. public class TestHandler extends IJobHandler {
  4. @Override
  5. public ReturnT<String> execute(String param) throws Exception {
  6. System.out.println("执行了TestHandler一次");
    return SUCCESS;
  7. }
  8. }

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

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

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

 

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

  1、修改执行器:

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

    

 

    对执行器进行编辑,注册方式改为【手动录入】,机器地址写入客户端(微服务)具体的ip:port后,点击保存。

  2、任务管理编辑:

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

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

    同时,在对任务的Cron进行修改、保存后,会动态的更新定时计划,实现了项目中的期望。

 

    由于每个微服务的ip和port可以在执行器的机器地址中,通过逗号分隔的方式,可增加多个客户端的地址,则解决了项目中多实例的问题。

原文链接:http://www.cnblogs.com/just-coder/p/10981618.html

 友情链接:直通硅谷  点职佳  北美留学生论坛

本站QQ群:前端 618073944 | Java 606181507 | Python 626812652 | C/C++ 612253063 | 微信 634508462 | 苹果 692586424 | C#/.net 182808419 | PHP 305140648 | 运维 608723728

W3xue 的所有内容仅供测试,对任何法律问题及风险不承担任何责任。通过使用本站内容随之而来的风险与本站无关。
关于我们  |  意见建议  |  捐助我们  |  报错有奖  |  广告合作、友情链接(目前9元/月)请联系QQ:27243702 沸活量
皖ICP备17017327号-2 皖公网安备34020702000426号