概述
项目开发过程中,往往会有这样的业务场景:硬件设备会发给接收平台发送实时数据,而项目中还需要小时、日、月等数据,这时就需要定时触发一些计算任务,来将实时数据汇总成分钟、小时、日、月数据。jdk也提供定时任务执行类,比如Timer和TimerTask。现在给大家推荐一个执行定时任务的小工具,xxl-job。开源项目,大家可下载源代码。
工作原理
以下是本人理解的xxl-job的工作原理,官方也有工作原理的说明。
集成xxl-job
集成分两步:1 需要运行xxl-job-admin工程;2 业务工程集成
运行xxl-job-admin工程
下载源代码后,需要运行xxl-job-admin工程。此工程是任务调度的管理端,需要数据库支持,本例使用Mysql数据。在本地Mysql上运行初始化建库及建表语句(sql文件为doc/db下的tables_xxl_job.sql)。若mysql在远程服务器上,需修改工程application.properties文件中数据库连接变量,如下:
spring.datasource.url=jdbc:mysql://127.0.0.1:3306/xxl_job?useUnicode=true&characterEncoding=UTF-8&autoReconnect=true&serverTimezone=Asia/Shanghai
运行成功后,访问http://localhost:8080/xxl-job-admin,成功如下:
默认登录用户:admin/123456
业务工程集成
- maven引入
<dependency>
<groupId>com.xuxueli</groupId>
<artifactId>xxl-job-core</artifactId>
<version>2.2.1-SNAPSHOT</version>
</dependency>
- 增加配置类
@Configuration
public class XxlJobConfig {
private Logger logger = LoggerFactory.getLogger(XxlJobConfig.class);
@Value("${xxl.job.admin.addresses}")
private String adminAddresses;
@Value("${xxl.job.accessToken}")
private String accessToken;
@Value("${xxl.job.executor.appname}")
private String appname;
@Value("${xxl.job.executor.address}")
private String address;
@Value("${xxl.job.executor.ip}")
private String ip;
@Value("${xxl.job.executor.port}")
private int port;
@Value("${xxl.job.executor.logpath}")
private String logPath;
@Value("${xxl.job.executor.logretentiondays}")
private int logRetentionDays;
@Bean
public XxlJobSpringExecutor xxlJobExecutor() {
logger.info(">>>>>>>>>>> xxl-job config init.");
XxlJobSpringExecutor xxlJobSpringExecutor = new XxlJobSpringExecutor();
xxlJobSpringExecutor.setAdminAddresses(adminAddresses);
xxlJobSpringExecutor.setAppname(appname);
xxlJobSpringExecutor.setAddress(address);
xxlJobSpringExecutor.setIp(ip);
xxlJobSpringExecutor.setPort(port);
xxlJobSpringExecutor.setAccessToken(accessToken);
xxlJobSpringExecutor.setLogPath(logPath);
xxlJobSpringExecutor.setLogRetentionDays(logRetentionDays);
return xxlJobSpringExecutor;
}
}
- 配置文件application.yml增加配置
xxl:
job:
accessToken:
admin:
addresses: http://localhost:8080/xxl-job-admin //xxl-job admin地址
username: admin //xxl-job地址登录用户名
password: 123456 //xxl-job地址登录密码
executor:
address:
ip:
appname: xxl-job-executor-sample //执行器名称,可在任务调度中心下的执行器管理中增加
port: 9999
logpath: ./xxl-job/jobhandler
logretentiondays: 1
- 配置部分完成,下面就是业务代码部分
@XxlJob("demoJobHandler")
public ReturnT<String> testScheduler(String param) {
try {
//param 可接收任务传输参数,根据传输参数做业务逻辑处理
//定时执行业务代码
return new ReturnT<>("任务处理成功");
} catch (Exception e) {
e.printStackTrace();
return new ReturnT<>(500, "任务处理失败" + "原因是" + e.getMessage());
}
}
demoJobHandler需要在任务调度中心的任务管理中增加任务,与任务中的JobHandler对应,且执行器为application.yml配置文件中xxl.job.executor.appname设置的xxl-job-executor-sample。
验证
代码部分结束,下面就可以验证了。
运行工程中打印以下红框部分表示注册xxl-job成功
注册成功后,可在执行器管理中看到执行器xxl-job-executor-sample有1个在线机器地址。
若提示以下信息,则表示注册xxl-job失败
需要检查配置文件中以下配置是否正确