title: 分布式任务调度中心(xxl-job) tags:
- xxl-job
- 分布式调度
- cron categories: 工作日志 date: 2017-05-25 18:18:56
对于分布式调度选择较多 www.oschina.net/project/tag…
但大部分均依赖于外来组件(zookeeper等)对于初期的job center来说未免过重,经过筛选考虑可以使用xxl-job,只依赖mysql服务
使用方法:
- 项目中配置执行器
<!-- 配置02、执行器 -->
<bean id="xxlJobExecutor" class="com.xxl.job.core.executor.XxlJobExecutor" init-method="start"
destroy-method="destroy">
<!-- 执行器IP[选填],为空则自动获取 -->
<property name="ip" value="${xxl.job.executor.ip}"/>
<!-- 执行器端口号[必须] -->
<property name="port" value="${xxl.job.executor.port}"/>
<!-- 执行器AppName[选填],为空则关闭自动注册 -->
<property name="appName" value="${xxl.job.executor.appname}"/>
<!-- 执行器注册中心地址[选填],为空则关闭自动注册 -->
<property name="adminAddresses" value="${xxl.job.admin.addresses}"/>
<!-- 执行器日志路径[必填] -->
<property name="logPath" value="${xxl.job.executor.logpath}"/>
</bean>
复制代码
复制代码
- 配置jobcenter地址和执行端口
### xxl-job admin address list, such as "http://address" or "http://address01,http://address02"
xxl.job.admin.addresses=http://192.168.1.116:8080/job-admin
### xxl-job executor address
xxl.job.executor.appname=f6-erp
xxl.job.executor.ip=
xxl.job.executor.port=19999
### xxl-job log path
xxl.job.executor.logpath=${catalina.base}/logs/
复制代码
根据环境不同可以利用maven配置不同的appName,appname对应在执行器的名称
复制代码
- 对于需要触发job的任务继承AbstractF6MonitorJob同时增加注解JobHandler,配置让spring扫描到即可
@Component
@JobHander(value = "库存均价校验")
public class ValidateAvgPriceJob extends AbstractF6MonitorJob {
@Autowired
private MonitorService monitorService;
@Override
public ReturnT<String> execute(String... params) throws Exception {
validateAvgPrice();
return ReturnT.SUCCESS;
}
public void validateAvgPrice() {
DateTime now = new DateTime();
DateTime deleteDate = now.minusDays(OLD_DAY_DROP_TABLE);
if (needDropTable(deleteDate)) {
monitorService.dropMonitorTable(deleteDate.toString(TABLE_NAME_PATTERN));
}
String suffix = now.toString(TABLE_NAME_PATTERN);
if (monitorService.checkTableExists(suffix).size() == 0) {
monitorService.createMonitorTable(now.toString(TABLE_NAME_PATTERN));
}
DateTime yesterday = now.minusDays(1);
String startSuffix = yesterday.toString(TABLE_NAME_PATTERN);
if (monitorService.checkTableExists(startSuffix).size() == 1) {
MonitorSo so = new MonitorSo(startSuffix, now.toString(TABLE_NAME_PATTERN), yesterday.toString(DEFAULT_DAY_FORMAT_PATTERN), now.toString(DEFAULT_DAY_FORMAT_PATTERN));
List<MonitorVo> diff = monitorService.selectDiffAvgPrice(so);
if (!diff.isEmpty()) {
generateLog("validateAvgPrice", diff);
}
diff = monitorService.selectDiffStock(so);
if (!diff.isEmpty()) {
generateLog("validateStockWithSnapShot", diff);
}
}
}
private boolean needDropTable(DateTime deleteDate) {
//月末数据为1号被封,因此不删除1号数据
return deleteDate.get(DateTimeFieldType.dayOfMonth()) != 1;
}
}
复制代码
复制代码
- 配置完成后增加执行器,通常配置为自动注册,appName注意和配置文件对应
- 配置执行job,选择合适的执行器以及调度cron 表达式 运行模式可以参考my.oschina.net/xuxueli/blo… 支持shell,python脚本和java代码以及预定义job
- 如果job执行失败会受到错误邮件
- 开发或者测试可以手动触发或者暂停job的执行