目前项目中,采用的是微服务框架,因为在微服务中,存在须要定时的任务。但若是定时任务维护在每一个微服务下,当微服务部署多个实例的状况下,会出现定事任务屡次执行的状况。而且在解决问题的基础上,但愿可以实现动态修改任务的定时时间,能够经过页面对定时任务进行控制。mysql
首先,XXL-JOB是一个轻量级分布式任务调度平台,内容采用了Quartz定时框架实现,服务之间通讯经过RPC的方式实现。git
其次,在功能方面:github
详情可参考官方网站:http://www.xuxueli.com/xxl-jobweb
github地址:https://github.com/xuxueli/xxl-jobspring
其中,xxl-job-core为核心代码块,xxl-job-admin为任务调度中心管理模块,部署的话,部署xxl-job-admin便可。sql
sql文件为:xxl-job/doc/db/tables_xxl_job.sql,在mysql数据库中执行该sql,能生成新的数据库xxl-job及相关的数据库表xxl_job_*。数据库
目前从源码来看,暂时只支持mysql数据库,如需支持其余数据库,可在源码上进行相关的修改:如mybatis的配置、sql语句等。服务器
修改xxl-job-admin下的配置文件:application.propertiesmybatis
在配置文件中,主要须要修改数据库地址(spring.datasource.url)、用户名(spring.datasource.username)、密码的配置(spring.datasource.password)为实际的部署环境。app
端口号(server.port)默认为8080,可修改。
访问地址(server.context-path)默认为xxl-job-admin,可修改。
启动成功后,可经过访问http://localhost:8080/xxl-job-admin来对任务调度中心进行访问。
用户名密码默认为:admin/123456
pom.xml中,增长依赖:
<dependency> <groupId>com.xuxueli</groupId> <artifactId>xxl-job-core</artifactId> <version>2.0.2</version> </dependency>
本文采用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可不填,会自动识别注册。
此处须要注意版本差别,因为服务器端采用的是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; } }
代码以下所示:
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”,此命名须要是惟一的,后续再服务器中配置会用到。
启动成功后,会自动在服务器中,增长一个名为【plat-job】的执行器,用来执行定时任务。
访问服务器页面登陆成功后,点击执行器管理,如图:
对执行器进行编辑,注册方式改成【手动录入】,机器地址写入客户端(微服务)具体的ip:port后,点击保存。
点击【任务管理】页签【新增】按钮,执行器选择plat-job,JobHandler编写为【TestHandler】,Cron为定时计划,如图所示:
保存后,可点击【执行】按钮,查看是否调用了客户端的Handler处理。在此再也不演示。如可执行,则点击【启动】按钮,会在定时计划内,再次调用Handler处理。
同时,在对任务的Cron进行修改、保存后,会动态的更新定时计划,实现了项目中的指望。
因为每一个微服务的ip和port能够在执行器的机器地址中,经过逗号分隔的方式,可增长多个客户端的地址,则解决了项目中多实例的问题。