xxl-job官方网址
GitHub:https://github.com/xuxueli/xxl-job
码云:https://gitee.com/xuxueli0323/xxl-job
中文文档:http://www.xuxueli.com/xxl-job/#/
英文文档:http://www.xuxueli.com/xxl-job/en/#/
初始化脚本在上面源码目录的 /doc/db/tables_xxl_job.sql ,将此脚本在MySQL数据库中执行一遍。
执行完毕,会在MySQL数据库中生成如下 16 张表:
调度中心就是源码中的 xxl-job-admin 工程,我们需要将其配置成自己需要的调度中心,通过该工程我们能够以图形化的方式统一管理任务调度平台上调度任务,负责触发调度执行。
文件地址:/xxl-job/xxl-job-admin/src/main/resources/xxl-job-admin.properties
配置文件说明:
### 1、调度中心项目的端口号以及访问路径
server.port=8080
server.context-path=/xxl-job-admin
### 2、配置静态文件的前缀
spring.mvc.static-path-pattern=/static/**
spring.resources.static-locations=classpath:/static/
### 3、配置模板文件
spring.freemarker.templateLoaderPath=classpath:/templates/
spring.freemarker.suffix=.ftl
spring.freemarker.charset=UTF-8
spring.freemarker.request-context-attribute=request
spring.freemarker.settings.number_format=0.##########
### 4、配置mybatis的mapper文件地址
mybatis.mapper-locations=classpath:/mybatis-mapper/*Mapper.xml
### 5、配置数据库的地址
spring.datasource.url=jdbc:mysql://127.0.0.1:3306/xxl-job?Unicode=true&characterEncoding=UTF-8
spring.datasource.username=root
spring.datasource.password=root_pwd
spring.datasource.driver-class-name=com.mysql.jdbc.Driver
spring.datasource.type=org.apache.tomcat.jdbc.pool.DataSource
spring.datasource.tomcat.max-wait=10000
spring.datasource.tomcat.max-active=30
spring.datasource.tomcat.test-on-borrow=true
spring.datasource.tomcat.validation-query=SELECT 1
spring.datasource.tomcat.validation-interval=30000
### 6、配置报警邮箱
spring.mail.host=smtp.qq.com
spring.mail.port=25
[email protected]
spring.mail.password=xxx
spring.mail.properties.mail.smtp.auth=true
spring.mail.properties.mail.smtp.starttls.enable=true
spring.mail.properties.mail.smtp.starttls.required=true
### 7、管理界面的登录用户名密码
xxl.job.login.username=admin
xxl.job.login.password=123456
### 8、调度中心通讯TOKEN,非空时启用
xxl.job.accessToken=
### 9、调度中心国际化设置,默认为中文版本,值设置为“en”时切换为英文版本
xxl.job.i18n=
注意:基本上上面的配置文件我们需要修改的只有第 5 点,修改数据库的地址,这要与我们前面初始化的数据库名称径,用户名密码保持一致;
第二个就是修改第 6 点,报警邮箱,因为该工程任务失败后有失败告警功能,可以通过邮件来提醒,如果我们需要此功能,可以配置一下。
该工程是一个springboot项目,我们只需要在IDEA中执行 XxlJobAdminApplication 类即可运行该工程:
在浏览器输入 http://localhost:8080/xxl-job-admin 然后输入用户名和密码(前面配置文件中配置的),即可看到如下管理界面。
其实在源码中,作者提供了各个版本的 执行器项目,下面我以创建一个 springboot 版本的执行器为例来介绍
<dependency>
<groupId>com.xuxueligroupId>
<artifactId>xxl-job-coreartifactId>
<version>2.1.0version>
dependency>
# Job config
xxl:
job:
admin:
#调度中心部署跟地址:如调度中心集群部署存在多个地址则用逗号分隔。
#执行器将会使用该地址进行"执行器心跳注册"和"任务结果回调"。
address: http://192.168.110.124:7899/job
#分别配置执行器的名称、ip地址、端口号
#注意:如果配置多个执行器时,防止端口冲突
executor:
appname: job-executor-${server.port}
ip:
port: 7900
#执行器运行日志文件存储的磁盘位置,需要对该路径拥有读写权限
logpath: /opt/xxl-job-logs/jobhandler
#执行器Log文件定期清理功能,指定日志保存天数,日志文件过期自动删除。限制至少保持3天,否则功能不生效;
#-1表示永不删除
logretentiondays: -1
accessToken:
// Copyright 2016-2101 Pica.
package com.pica.cloud.commercialization.crrs.config;
import com.xxl.job.core.executor.impl.XxlJobSpringExecutor;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
/**
* @ClassName JobExecutorConfiguration
* @Description xxl-job配置
* @Author Chongwen.jiang
* @Date 2019/8/26 13:09
* @ModifyDate 2019/8/26 13:09
* @Version 1.0
*/
@Configuration
@Slf4j
public class JobExecutorConfiguration {
@Value("${xxl.job.admin.address}")
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;
@Value("${xxl.job.executor.logretentiondays}")
private int logRetentionDays;
@Bean(initMethod = "start", destroyMethod = "destroy")
public XxlJobSpringExecutor xxlJobActivityExecutor() {
log.info("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;
}
}
开发JobHandler Bean,execute方法中执行业务逻辑
JobHandler 必须在项目中唯一,
@JobHandler(value=“ActivityTaskHandler”) value 与类名保持一致
一个类只能有一个JobHandler
JobHandler命名规则:
// Copyright 2016-2101 Pica.
package com.pica.cloud.commercialization.crrs.task;
import com.pica.cloud.commercialization.crrs.service.TaskService;
import com.xxl.job.core.biz.model.ReturnT;
import com.xxl.job.core.handler.IJobHandler;
import com.xxl.job.core.handler.annotation.JobHandler;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
/**
* @ClassName ActivityTaskHandler
* @Description xxl-job handler
* * 开发步骤:
* 1、继承"IJobHandler":“com.xxl.job.core.handler.IJobHandler”;
* 2、注册到Spring容器:添加“@Component”注解,被Spring容器扫描为Bean实例;
* 3、注册到执行器工厂:添加“@JobHandler(value="自定义jobhandler名称")”注解,注解value值对应的是调度中心新建任务的JobHandler属性的值。
* 4、执行日志:需要通过 "XxlJobLogger.log" 打印执行日志;
* @Author Chongwen.jiang
* @Date 2019/8/26 13:14
* @ModifyDate 2019/8/26 13:14
* @Version 1.0
*/
@Slf4j
@JobHandler("ActivityTaskHandler")
@Component
public class ActivityTaskHandler extends IJobHandler{
@Autowired
private TaskService taskService;
/**
* @Description 活动所需要的数据入缓存task执行
* @Author Chongwen.jiang
* @Date 2019/8/26 13:47
* @ModifyDate 2019/8/26 13:47
* @Params [taskType]
* @Return com.xxl.job.core.biz.model.ReturnT
*/
@Override
public ReturnT<String> execute(String taskType) throws Exception {
//job业务代码执行
taskService.executeActivityTask(taskType);
return SUCCESS;
}
}
相同名称的执行器被认为是同一个执行器,执行器与JobHandler是一对多的关系,控制中心通过一个执行器调度多个JobHandler
AppName:job-executor-${server.port} ,必须与 botstrap-xxx.properties 配置文件中的 xxl.job.executor.appname 配置项一致。
名称:${server.port}-exec
JobHandler来自:@JobHandler(“ActivityTaskHandler”)
注意:
JobHandler 默认状态为STOP,这意味着这个Job没有启动,永远也不会被执行。
这里我们需要手动启动它,启动后的Job状态为RUNNING,Job会按照Cron周期执行