elastic-job分布式定时任务
我们在项目开发中, 使用定时任务是避免不了的, 我们在部署定时任务时, 通常只部署一台机器.部署多台机器时, 同一个任务会执行多次.比如短信提醒, 每天定时的给用户下发短信, 如果部署了多台, 同一个用户将发送多条. 只部署一台机器可用性又无法保证. 今天向大家介绍一款开源产品, 分布式定时任务解决方案 ---- elastic-job
一、简介
Elastic-Job是一个分布式调度解决方案,由两个相互独立的子项目Elastic-Job-Lite和Elastic-Job-Cloud组成。Elastic-Job-Lite定位为轻量级无中心化解决方案,使用jar包的形式提供分布式任务的协调服务;Elastic-Job-Cloud采用自研Mesos Framework的解决方案,额外提供资源治理、应用分发以及进程隔离等功能;简单的讲Elastic-Job-Lite就是一个分布式定时任务。此处我们只说Elastic-Job-Lite的使用。
1.分片概念
任务的分布式执行,需要将一个任务拆分为多个独立的任务分片项,然后由分布式的服务器分别执行某一个或几个分片项。
Elastic-Job并不直接提供数据处理的功能,框架只会将分片项分配至各个运行中的作业服务器,开发者需要自行处理分片项与真实数据的对应关系。
2.作业高可用
如果有一个应用挂掉,分片项将会重新分片,没有挂掉的应用将获得分片项0-9。
二、实际应用
基于spring配置文件的应用
1.添加maven依赖
<!-- 引入elastic-job-lite核心模块 -->
<dependency>
<groupId>com.dangdang</groupId>
<artifactId>elastic-job-lite-core</artifactId>
<version>${latest.release.version}</version>
</dependency>
<!-- 使用springframework自定义命名空间时引入 -->
<dependency>
<groupId>com.dangdang</groupId>
<artifactId>elastic-job-lite-spring</artifactId>
<version>${latest.release.version}</version>
</dependency>
2.spring配置
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:reg="http://www.dangdang.com/schema/ddframe/reg"
xmlns:job="http://www.dangdang.com/schema/ddframe/job"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans.xsd
http://www.dangdang.com/schema/ddframe/reg
http://www.dangdang.com/schema/ddframe/reg/reg.xsd
http://www.dangdang.com/schema/ddframe/job
http://www.dangdang.com/schema/ddframe/job/job.xsd
">
<!--配置作业注册中心 -->
<reg:zookeeper id="regCenter" server-lists="${elastic.server.list}"
namespace="${elastic.namespace}" base-sleep-time-milliseconds="${elastic.base.sleep.time}" max-sleep-time-milliseconds="${elastic.max.sleep.time}"
max-retries="${elastic.max.retries}"/>
<!-- 配置简单作业-->
<job:simple id="autoFlightChangeRecordTask" class="com.liantuo.international.core.task.AutoFlightChangeRecordTask"
registry-center-ref="regCenter" cron="0 0/1 * * * ?" sharding-total-count="1" overwrite="true"/>
</beans>
3.定时任务类
package com.liantuo.international.core.util;
import com.dangdang.ddframe.job.api.ShardingContext;
import com.dangdang.ddframe.job.api.simple.SimpleJob;
import com.liantuo.international.core.service.IntlFlightChangeRecordService;
import com.liantuo.util.PropertyUtil;
import com.liantuo.util.StringUtils;
import org.apache.log4j.Logger;
import org.springframework.beans.factory.annotation.Autowired;
public class AutoFlightChangeRecordTask implements SimpleJob {
public static final Logger logger = Logger.getLogger(AutoFlightChangeRecordTask.class);
@Autowired
private IntlFlightChangeRecordService intlFlightChangeRecordService;
@Override
public void execute(ShardingContext shardingContext) {
String isUpdate = PropertyUtil.getProperty("auto.flight.change.record.task", "/config/properties/system.properties");
if (StringUtils.isBlank(isUpdate) || "false".equals(isUpdate)) {
logger.info("系统自动检索平台XXXXXX的定时任务没开启或者没设置开启参数。。。。。。");
return;
}
logger.info("系统自动检索平台XXXXXXX记录开始。。。。。。" + shardingContext.getShardingItem());
switch (shardingContext.getShardingItem()) {
case 0:
createChangeOrderInfo();
break;
case 1:
break;
}
}
private void createChangeOrderInfo() {
try {
//处理相关业务
}catch (Exception e){
logger.info("系统自动检索平台XXXXXX错误。。。。");
e.printStackTrace();
}
}
}
4. 配置文件
elastic-job.properties配置文件
elastic.server.list=192.168.7.65:2181,192.168.7.66:2181,192.168.7.67:2181
elastic.namespace=liantuo-job
elastic.base.sleep.time=1000
elastic.max.sleep.time=3000
elastic.max.retries=3
system.properties配置文件
auto.flight.change.record.task = true
5. 输出结果