天天看點

springboot內建分布式定時任務排程Elastic-Job及運維平台Elastic-Job-Console使用1.springboot內建分布式定時任務排程Elastic-Job2.運維平台Elastic-Job-Console搭建及使用

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裡配置的

springboot內建分布式定時任務排程Elastic-Job及運維平台Elastic-Job-Console使用1.springboot內建分布式定時任務排程Elastic-Job2.運維平台Elastic-Job-Console搭建及使用

注冊中心名稱:自定義名稱,可以随便命名

注冊中心位址: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資訊

springboot內建分布式定時任務排程Elastic-Job及運維平台Elastic-Job-Console使用1.springboot內建分布式定時任務排程Elastic-Job2.運維平台Elastic-Job-Console搭建及使用

注意,一般第一次部署運維平台定時任務會顯示分片待調整,需要任務執行一次,可以等待任務執行一次後後面就會顯示觸發按鈕,點選觸發按鈕可以手動執行定時任務,點選修改按鈕,可以修改執行時間,分片數量等。

有的運維平台,我們可以很友善的動态調整分布式定時任務。

運維平台本身和job沒有關系,原理是通過拉取zk注冊中心的配置資訊,修改zk資訊來達到動态控制任務。