Spring boot下,集成任务调度中心(XXL-JOB)
一、使用背景
目前项目中,采用的是微服务框架,由于在微服务中,存在需要定时的任务。但如果定时任务维护在每个微服务下,当微服务部署多个实例的情况下,会出现定事任务多次执行的情况。并且在解决问题的基础上,希望能够实现动态修改任务的定时时间,可以通过页面对定时任务进行控制。
二、xxl-job简单介绍
首先,xxl-job是一个轻量级分布式任务调度平台,内容采用了quartz定时框架实现,服务之间通信通过rpc的方式实现。
其次,在功能方面:
- 支持通过web页面对任务进行增删改查操作
- 支持动态修改任务状态、启动、停止等,即时生效。
- 支持多种阻塞处理策略,如串行、丢弃后续调度、覆盖之前调度
- 支持超时控制、失败重试、邮件报警等处理
- ......
详情可参考官方网站:
三、服务端实现过程
1、xxl-job源码下载:
github地址:
其中,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.0.2</version> </dependency>
2、修改配置文件:
本文采用yml配置文件,增加配置如下:
xxl: job: admin: addresses: http://localhost:8080/xxl-job-admin executor: ip: port: 9999 logpath: /data/applogs/xxl-job/jobhandler appname: plat-job accesstoken:
其中ip可不填,会自动识别注册。
3、编写configuration类
此处需要注意版本差异,由于服务器端采用的是v2+,客户端也需要采用v2+。不然会有异常。
v2+的配置类代码如下:
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、编写handler类(实际处理任务):
代码如下所示:
import com.xxl.job.core.biz.model.returnt;
import com.xxl.job.core.handler.ijobhandler;
import com.xxl.job.core.handler.annotation.jobhandler;
@jobhandler(value="testhandler") @component public class testhandler extends ijobhandler { @override public returnt<string> execute(string param) throws exception { system.out.println("执行了testhandler一次");
return success; } }
在上面代码中,handler的命名为“testhandler”,此命名需要是唯一的,后续再服务器中配置会用到。
5、启动客户端(微服务):
启动成功后,会自动在服务器中,增加一个名为【plat-job】的执行器,用来执行定时任务。
五、服务器端页面中进行配置:
1、修改执行器:
访问服务器页面登录成功后,点击执行器管理,如图:
对执行器进行编辑,注册方式改为【手动录入】,机器地址写入客户端(微服务)具体的ip:port后,点击保存。
2、任务管理编辑:
点击【任务管理】页签【新增】按钮,执行器选择plat-job,jobhandler编写为【testhandler】,cron为定时计划,如图所示:
保存后,可点击【执行】按钮,查看是否调用了客户端的handler处理。在此不再演示。如可执行,则点击【启动】按钮,会在定时计划内,再次调用handler处理。
同时,在对任务的cron进行修改、保存后,会动态的更新定时计划,实现了项目中的期望。
由于每个微服务的ip和port可以在执行器的机器地址中,通过逗号分隔的方式,可增加多个客户端的地址,则解决了项目中多实例的问题。
上一篇: Photoshop 物体漂浮的效果