1.springboot內建分布式定時任務排程Elastic-Job
1.pom.xml依賴Elastic-Job
<!-- 定時任務 -->
<dependency>
<groupId>com.github.kuhn-he</groupId>
<artifactId>elastic-job-lite-spring-boot-starter</artifactId>
<version>2.1.5</version>
</dependency>
2.application配置
#定時任務
elaticjob.zookeeper.server-lists=172.16.102.11:2181,172.16.102.12:2181,172.16.102.13:2181
elaticjob.zookeeper.namespace=ccsm-bill-job
修改對應zk叢集位址
##3.編寫定時任務
package com.zhcx.common.job;
import java.text.SimpleDateFormat;
import java.util.Calendar;
import java.util.Date;
import java.util.List;
import java.util.stream.Collectors;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.dangdang.ddframe.job.api.ShardingContext;
import com.dangdang.ddframe.job.api.simple.SimpleJob;
import com.dangdang.elasticjob.lite.annotation.ElasticSimpleJob;
import com.zhcx.common.enums.AlipayBillTypeEnum;
import com.zhcx.domain.BillParam;
import com.zhcx.modules.domain.MerchantInfoNew;
import com.zhcx.modules.mapper.MerchantInfoMapper;
import com.zhcx.service.BillSegmentService;
import lombok.extern.slf4j.Slf4j;
@Slf4j
@Component
@ElasticSimpleJob(cron = "0 30 9 * * ?", shardingTotalCount = 3)
public class AutoBillDataJob implements SimpleJob {
private static SimpleDateFormat sdfYMD = new SimpleDateFormat("yyyy-MM-dd");
private final static int CARD_TYPE = 1;
@Autowired
private BillSegmentService billSegmentService;
@Autowired
private MerchantInfoMapper merchantInfoMapper;
@Override
public void execute(ShardingContext shardingContext) {
// 總分片數
int total = shardingContext.getShardingTotalCount();
// 目前分片
int item = shardingContext.getShardingItem();
Calendar cal = Calendar.getInstance();
cal.setTime(new Date());
cal.add(Calendar.DAY_OF_MONTH, -1);
String billDay = sdfYMD.format(cal.getTime());
log.info("{} 支付寶自動對賬開始", billDay);
try {
// 查詢商戶
QueryWrapper<MerchantInfoNew> queryWrapper = new QueryWrapper<>();
queryWrapper.eq("merchant_type", CARD_TYPE);
List<MerchantInfoNew> merchantInfos = merchantInfoMapper.selectList(queryWrapper);
if (null == merchantInfos || merchantInfos.size() == 0) {
log.warn("{} 支付寶自動對賬商戶不存在", billDay);
return;
}
log.info("目前任務分片:{}", item);
// 利用取模算法過濾出落在該分片的appid
merchantInfos = merchantInfos.stream()
.filter(merchantInfo -> Integer.parseInt(
merchantInfo.getAppId().substring(merchantInfo.getAppId().length() - 1)) % total == item)
.collect(Collectors.toList());
for (MerchantInfoNew merchantInfo : merchantInfos) {
BillParam billParam = new BillParam();
billParam.setAppId(merchantInfo.getAppId());
billParam.setType("alipay");
billParam.setDayTime(billDay);
billParam.setBillType(AlipayBillTypeEnum.SIGNCUSTOMER.getType());
try {
billSegmentService.doBill(billParam);
} catch (Exception e) {
log.error("{}--{} 支付寶自動對賬異常", merchantInfo.getAppId(), billDay);
log.error(e.getMessage(), e);
}
}
} catch (Exception e) {
log.error("{} 支付寶自動對賬異常", billDay);
log.error(e.getMessage(), e);
}
log.info("{} 支付寶自動對賬完成", billDay);
}
}
@ElasticSimpleJob(cron = “0 30 9 * * ?”, shardingTotalCount = 3)
cron:執行時間表達式
shardingTotalCount :分片數,一般設定為對應機器機器數量
springboot定時任務內建完畢,啟動springboot,到時間就會自動執行,如果shardingTotalCount=1,就隻會選擇一台機器執行定時任務,通過上傳到zk的配置資訊統一排程。
2.運維平台Elastic-Job-Console搭建及使用
1.Elastic-Job-Console下載下傳及搭建
源碼下載下傳:https://github.com/elasticjob/elastic-job-lite,切換master分支
maven編譯安裝:進入到elastic-job目錄,按住Shift+滑鼠右鍵,選擇“在此處打開指令視窗(W)”,執行如下指令:
mvn clean install -Dmaven.test.skip=true
解壓上一步打好的包
路徑:elastic-job\elastic-job-lite\elastic-job-lite-console\target\elastic-job-lite-console-2.1.5.tar.gz
elastic-job-lite-console-2.1.5\bin目錄下是啟動腳本
windows環境用:start.bat
linux環境用:start.sh
elastic-job-lite-console-2.1.5\conf目錄下是配置檔案auth.properties,配置的使用者名和密碼
root.username=root
root.password=root
guest.username=guest
guest.password=guest
建議修改密碼
日志輸出配置檔案logback.xml,可以修改成自己想要的輸出方式
2.啟動并配置定時任務注冊中心
liunx下./start.sh &
啟動完成通路 http://localhost:8899,密碼和使用者名為auth.properties裡配置的
注冊中心名稱:自定義名稱,可以随便命名
注冊中心位址:zk位址,對應項目中配置的job zk叢集位址
命名空間:對應項目中配置的job命名空間
如下,elaticjob.zookeeper.server-lists是 zk叢集位址,elaticjob.zookeeper.namespace是命名空間
elaticjob.zookeeper.server-lists=172.16.102.11:2181,172.16.102.12:2181,172.16.102.13:2181
elaticjob.zookeeper.namespace=ccsm-bill-job
可以配置多個注冊中心,但是每次隻能連接配接一個注冊中心操作。
連接配接成功後作業操作一欄就會顯示目前注冊中心的job資訊
注意,一般第一次部署運維平台定時任務會顯示分片待調整,需要任務執行一次,可以等待任務執行一次後後面就會顯示觸發按鈕,點選觸發按鈕可以手動執行定時任務,點選修改按鈕,可以修改執行時間,分片數量等。
有的運維平台,我們可以很友善的動态調整分布式定時任務。
運維平台本身和job沒有關系,原理是通過拉取zk注冊中心的配置資訊,修改zk資訊來達到動态控制任務。