使用背景:單體應用中要實現任務調度時很簡單,不管是JDK的定時也好還是spring的定時任務也好都可以實現。但是隨着服務架構的升級,在集羣架構中,一個服務由多個實例,那麼這時候就需要一個任務調度框架保證某個定時任務只會在多個實例服務中的一個裏得到執行,不會執行多次。
那麼XXL-JOB通過執行器實現“協同分配式”運行任務,充分發揮集羣優勢,負載各節點均衡。同解決方案框架quartz底層以“搶佔式”獲取DB鎖並由搶佔成功節點負責運行任務,會導致節點負載懸殊非常大。
首先簡單貼一下使用案例
<!-- http://repo1.maven.org/maven2/com/xuxueli/xxl-job-core/ -->
<dependency>
<groupId>com.xuxueli</groupId>
<artifactId>xxl-job-core</artifactId>
<version>${最新穩定版本}</version>
</dependency>
開發一個定時任務:
@JobHandler(value = "DemoJobHandler")這裏的value值對應下圖 調度中心配置界面中創建任務時的 任務DemoJobHandler
package com.ebiz.renewal.batch;
import com.ebiz.renewal.service.RenewalMsgService;
import com.xxl.job.core.biz.model.ReturnT;
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;
/**
* @Description: 消息提醒
* @Author: fkk
* @CreateDate: 2020/4/15 13:49
* @Version: 1.0.0
*/
@JobHandler(value = "DemoJobHandler")
@Component
@Slf4j
public class renewalMsgJob {
@Autowired
private RenewalMsgService renewalMsgService;
public ReturnT<String> excuteJob(){
try{
renewalMsgService.sendMes();
return ReturnT.SUCCESS;
}catch (Exception e) {
log.error("[renewalMsgJob 執行異常", e);
return ReturnT.FAIL;
}
}
}