【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 项目中,后面还会深入学习此分布式定时任务框架的其他知识,将此分布式定时任务框架与其他框架进行对比学习。