成人国产在线小视频_日韩寡妇人妻调教在线播放_色成人www永久在线观看_2018国产精品久久_亚洲欧美高清在线30p_亚洲少妇综合一区_黄色在线播放国产_亚洲另类技巧小说校园_国产主播xx日韩_a级毛片在线免费

資訊專欄INFORMATION COLUMN

分布式定時(shí)任務(wù)組件

Mertens / 939人閱讀

摘要:基于的分布式任務(wù)調(diào)度組件,非常小巧,使用簡(jiǎn)單,只需要引入包。單個(gè)任務(wù)節(jié)點(diǎn)故障時(shí)自動(dòng)轉(zhuǎn)移到其他任務(wù)節(jié)點(diǎn)繼續(xù)執(zhí)行。和都是一整套的定時(shí)任務(wù)框架,沒(méi)有必要強(qiáng)行將集成進(jìn)來(lái),專注做的分布式以及動(dòng)態(tài)任務(wù)的封裝。是之后自主開(kāi)發(fā)的定時(shí)任務(wù)工具。

基于Spring Task + Zookeeper的分布式任務(wù)調(diào)度組件,非常小巧,使用簡(jiǎn)單,只需要引入jar包。不需要多帶帶部署服務(wù)端。確保所有任務(wù)在集群中不重復(fù),不遺漏的執(zhí)行。支持動(dòng)態(tài)添加和刪除任務(wù)。

GitHub地址

功能概述(包括優(yōu)化的部分)

基于zookeeper+spring task的分布任務(wù)調(diào)度系統(tǒng)。

確保每個(gè)任務(wù)在集群中不同節(jié)點(diǎn)上不重復(fù)的執(zhí)行。

單個(gè)任務(wù)節(jié)點(diǎn)故障時(shí)自動(dòng)轉(zhuǎn)移到其他任務(wù)節(jié)點(diǎn)繼續(xù)執(zhí)行。

任務(wù)節(jié)點(diǎn)啟動(dòng)時(shí)必須保證zookeeper可用,任務(wù)節(jié)點(diǎn)運(yùn)行期zookeeper集群不可用時(shí)任務(wù)節(jié)點(diǎn)保持可用前狀態(tài)運(yùn)行,zookeeper集群恢復(fù)正常運(yùn)行。

支持動(dòng)態(tài)添加、修改和刪除任務(wù),支持任務(wù)暫停和重新啟動(dòng)。

添加ip黑名單,過(guò)濾不需要執(zhí)行任務(wù)的節(jié)點(diǎn)。

后臺(tái)管理和任務(wù)執(zhí)行監(jiān)控。

支持spring-boot,支持單個(gè)任務(wù)運(yùn)行多個(gè)實(shí)例(使用擴(kuò)展后綴)。

主要改動(dòng)

刪除了quartz的集成。Spring Task和quartz都是一整套的定時(shí)任務(wù)框架,沒(méi)有必要強(qiáng)行將quartz集成進(jìn)來(lái),專注做Spring Task的分布式以及動(dòng)態(tài)任務(wù)的封裝。刪除quartz后,組件更加輕便。且所有功能依舊保留。

對(duì)于Spring Boot的支持更加智能化。通過(guò)spring.factories的方式自動(dòng)加載配置類UncodeScheduleAutoConfiguration。只需要引入jar包依賴,無(wú)須顯示的添加配置類掃描。

參照Alibaba代碼規(guī)范對(duì)代碼進(jìn)行了大量重構(gòu)優(yōu)化,更具有可讀性。

刪除了默認(rèn)1s的心跳機(jī)制(主要作用:刷新server、重新分配任務(wù)、檢查當(dāng)前serve可執(zhí)行的任務(wù)),采用watcher的方式,對(duì)server節(jié)點(diǎn)和task節(jié)點(diǎn)進(jìn)行動(dòng)態(tài)監(jiān)聽(tīng),進(jìn)一步提升性能。

對(duì)于非動(dòng)態(tài)添加的任務(wù),也就是注解或配置文件配置的任務(wù)會(huì)在容器啟動(dòng)通過(guò)組件定義的方式啟動(dòng)。但是在刪除此類任務(wù)時(shí),沒(méi)有真正的刪除,taskWrapper任然會(huì)定時(shí)的執(zhí)行。 解決了這個(gè)bug。

關(guān)于UncodeScheduleAutoConfiguration中SchedulerTaskManager的定義。將SchedulerTaskManager的Bean名稱定義為taskScheduler,這樣可以阻止Spring Task初始化名為taskScheduler的bean,以免重復(fù)加載。當(dāng)然你也可以不這么做,因?yàn)镾chedulerTaskManager繼承了ThreadPoolTaskScheduler,我們動(dòng)態(tài)添加的任務(wù)都是通過(guò)SchedulerTaskManager添加的。

說(shuō)明:

單節(jié)點(diǎn)故障時(shí)需要業(yè)務(wù)保障數(shù)據(jù)完整性或冪等性。

Spring Task是Spring 3.0之后自主開(kāi)發(fā)的定時(shí)任務(wù)工具。

Spring Task默認(rèn)不是并行執(zhí)行,需要添加一個(gè)名為taskScheduler的Bean,采用ThreadPoolTaskScheduler或其他線程池的Scheduler實(shí)現(xiàn)。Spring Task默認(rèn)采用ThreadPoolTaskScheduler

所有的任務(wù)都是基于Spring Bean的方式。可以通過(guò)定義一個(gè)或多個(gè)任務(wù)模板(Bean 的方式),通過(guò)使用任務(wù)后綴可以動(dòng)態(tài)的添加多個(gè)該模板的任務(wù)實(shí)例,你只需要傳遞不同的參數(shù)即可。

模塊架構(gòu)


代碼實(shí)戰(zhàn) 定義非動(dòng)態(tài)的定時(shí)任務(wù)
@Component    
public class SimpleTask {

    private static int i = 0;
    
    @Scheduled(fixedDelay = 5000)
    public void print() {
        System.out.println("===========start!=========");
        System.out.println("I:"+i);i++;
        System.out.println("=========== end !=========");
    }
    
    @Scheduled(cron = "0/5 * * * * ?")
    public void print1() {
        System.out.println("===========start!=========");
        System.out.println("I:"+i);i++;
        System.out.println("=========== end !=========");
    }
    
    @Scheduled(fixedRate = 3000)
    public void print3() {
        System.out.println("===========start!=========");
        System.out.println("I:"+i);i++;
        System.out.println("=========== end !=========");
    }
}
    
定義動(dòng)態(tài)的定時(shí)任務(wù)
// 定義任務(wù)實(shí)體
TaskDefine task = new TaskDefine();
task.setTargetBean(SchedulerTaskForward.BEAN_NAME);
task.setTargetMethod(SchedulerTaskForward.METHOD);
task.setExtKeySuffix(SUFFIX + model.getId());
task.setCronExpression(model.getCronExpression());
task.setParams(gson.toJson(model));
if (ConsoleManager.isExistsTask(task)) {
    // 更新
    ConsoleManager.updateScheduleTask(task);
} else {
    // 新增
    task.setStartTime(new Date());
    ConsoleManager.addScheduleTask(task);
}

SchedulerTaskForward是我預(yù)先定義好的任務(wù)模板,下面是代碼片段

@SuppressWarnings("unchecked")
@Component("schedulerTaskForward")
public class SchedulerTaskForward {
    public static final String BEAN_NAME = "schedulerTaskForward";
    public static final String METHOD = "forward";
    private Gson gson = new GsonBuilder().setDateFormat("yyyy-MM-dd HH:mm:ss").create();
    private static final Logger LOGGER = LoggerFactory.getLogger(SchedulerTaskForward.class);

    @Autowired
    private EpmManagerTerminalFeign terminalFeign;

    @Autowired
    private AmqpClientService mqService;

    @Value("${collectd.batch}")
    protected int batch;

    public void forward(String json) {
        SchedulerTaskModel model = gson.fromJson(json, SchedulerTaskModel.class);
        if (ExecuteType.report.getCode().equals(Integer.valueOf(model.getExecuteType()))) {
            // 上報(bào)的在定時(shí)任務(wù)中不執(zhí)行
            throw new SchedulerTaskExecuteException("任務(wù): " + model.getTaskName() + ", 屬于上報(bào)任務(wù), 禁止在定時(shí)任務(wù)中執(zhí)行");
        }
        executeCollect(TaskType.forCode(model.getTaskType()), model.getAfns(), model.getOrgId(), model.getTermType());
        LOGGER.debug("任務(wù): " + model.getTaskName() + ", 執(zhí)行完成");
    }
基于Spring Boot的配置

application.yml

uncode:
  schedule:
    zkConnect: ${spring.cloud.zookeeper.connectString}
    rootPath: /uncode/schedule
    zkSessionTimeout: 60000
    zkUsername: admin
    zkPassword: admin
    poolSize: 10
#    ipBlackList[0]: 127.0.0.2 #server黑名單可選
#    ipBlackList[1]: 127.0.0.3 #server黑名單可選

2 啟動(dòng)類

@SpringBootApplication
@EnableScheduling
// 這個(gè)也是可選的,如果你不需要默認(rèn)的任務(wù)管理界面的話
// 強(qiáng)烈建議自己去實(shí)現(xiàn)這個(gè)任務(wù)管理功能
@ServletComponentScan("cn.uncode.schedule")
public class UncodeScheduleApplication {
    public static void main(String[] agrs){
        SpringApplication.run(UncodeScheduleApplication.class,agrs);
    }
}
基于Spring項(xiàng)目配置


    
        
            
            
            
            
            
            
            
        
    





    
使用API或后臺(tái)添加任務(wù)(靜態(tài)方法的方式)

1 動(dòng)態(tài)添加任務(wù)

ConsoleManager.addScheduleTask(TaskDefine taskDefine);

2 動(dòng)態(tài)刪除任務(wù)

ConsoleManager.delScheduleTask(TaskDefine taskDefine);

3 動(dòng)態(tài)更新任務(wù)

ConsoleManager.updateScheduleTask(TaskDefine taskDefine);

4 查詢?nèi)蝿?wù)列表

ConsoleManager.queryScheduleTask();

使用API或后臺(tái)添加任務(wù)(Spring Bean的方式)

通過(guò)獲得我們定義的SchedulerTaskManager這個(gè)bean,依然可以動(dòng)態(tài)的添加任務(wù)。這里就不展示了。

關(guān)于

作者:劉惠濤
轉(zhuǎn)載請(qǐng)注明出處
2017-10-23

文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請(qǐng)注明本文地址:http://systransis.cn/yun/67869.html

相關(guān)文章

  • 微服務(wù)架構(gòu)中,二次淺封裝實(shí)踐

    摘要:三實(shí)踐案例案例簡(jiǎn)介分布式系統(tǒng)中,微服務(wù)基礎(chǔ)組件等,系統(tǒng)中間件,等,對(duì)常用功能配置等,進(jìn)行二次淺封裝并統(tǒng)一集成管理,以滿足日常開(kāi)發(fā)中基礎(chǔ)環(huán)境搭建與臨時(shí)工具的快速實(shí)現(xiàn)。 一、背景簡(jiǎn)介 分布式系統(tǒng)中存在很多拆分的服務(wù),在不斷迭代升級(jí)的過(guò)程中,會(huì)出現(xiàn)如下常見(jiàn)的棘手情況: 某個(gè)技術(shù)組件版本升級(jí),依賴包升級(jí)導(dǎo)致部分語(yǔ)法或者API過(guò)期,或者組件修復(fù)緊急的問(wèn)題,從而會(huì)導(dǎo)致分布式系統(tǒng)下各個(gè)服...

    Hujiawei 評(píng)論0 收藏0
  • 跨云遷移過(guò)程中的數(shù)據(jù)同步及一致性校驗(yàn)實(shí)踐(二)

    摘要:另外對(duì)于需要盡量減少應(yīng)用重啟的系統(tǒng)也可以優(yōu)先考慮這種方式來(lái)保障數(shù)據(jù)一致性。只需要保證這三類程序都是停止的,那么就可以保證沒(méi)有同步服務(wù)以外的程序?qū)?shù)據(jù)進(jìn)行修改,從而保障數(shù)據(jù)一致性。在《跨云遷移過(guò)程中的數(shù)據(jù)同步及一致性校驗(yàn)實(shí)踐(一)》中我們主要介紹了跨云遷移中數(shù)據(jù)同步階段的存儲(chǔ)組件MySQL、文件存儲(chǔ)和對(duì)象存儲(chǔ)的數(shù)據(jù)遷移過(guò)程,本文將重點(diǎn)圍繞跨云遷移的數(shù)據(jù)規(guī)整階段(清理測(cè)試時(shí)產(chǎn)生的臟數(shù)據(jù))和數(shù)據(jù)割...

    Tecode 評(píng)論0 收藏0
  • 用Quartz實(shí)現(xiàn)工作流

    摘要:也有,觸發(fā)點(diǎn)和相關(guān),和我們的需求關(guān)系不大,暫忽略。實(shí)現(xiàn)為每個(gè)算法任務(wù)創(chuàng)建一個(gè),任務(wù)失敗不能啟動(dòng)后續(xù)任務(wù),所以在運(yùn)行失敗的情況下,需要把啟動(dòng)的刪除掉。需要自己在中實(shí)現(xiàn)多個(gè)依賴是否完成的檢查。后續(xù)主線程的任務(wù)就是檢查工作流是否已經(jīng)完成。 Quartz簡(jiǎn)介 作為一個(gè)優(yōu)秀的開(kāi)源調(diào)度框架,Quartz 具有以下特點(diǎn):強(qiáng)大的調(diào)度功能,支持立即調(diào)度、定時(shí)調(diào)度、周期調(diào)度、并發(fā)調(diào)度; 靈活的應(yīng)用方式,支...

    Apollo 評(píng)論0 收藏0
  • 基于通用jar、動(dòng)態(tài)配置、組件編排的會(huì)員任務(wù)中心系統(tǒng)設(shè)計(jì)

    摘要:基于的動(dòng)態(tài)配置推送。對(duì)于任務(wù)中心這種多任務(wù)平臺(tái)型的配置,有一定影響。基于回調(diào)和配置的擴(kuò)展點(diǎn)流程共建在建中通過(guò)擴(kuò)展點(diǎn)共建方式,將流程編排的能力,暴露給內(nèi)外部的開(kāi)發(fā)者,完成任務(wù)中心的共建。 一、聊聊本文想說(shuō)什么: ??為更好幫助商家的會(huì)員快速成長(zhǎng),保持用戶活性,完善用戶的成長(zhǎng)體系,有贊用戶中心-會(huì)員成長(zhǎng)團(tuán)隊(duì)基于現(xiàn)有的業(yè)務(wù)場(chǎng)景,設(shè)計(jì)了一套較完備任務(wù)中心系統(tǒng)。同時(shí)也有很多通用技術(shù)組件能夠落地。...

    null1145 評(píng)論0 收藏0
  • 有贊業(yè)務(wù)對(duì)賬平臺(tái)的探索與實(shí)踐

    摘要:業(yè)務(wù)對(duì)賬平臺(tái)的核心目的,就是及時(shí)發(fā)現(xiàn)類似問(wèn)題,并及時(shí)修復(fù)。這對(duì)對(duì)賬平臺(tái)的吞吐量造成了挑戰(zhàn)。五健康度對(duì)賬中心可以拿到業(yè)務(wù)系統(tǒng)及其所在整個(gè)鏈路的數(shù)據(jù)一致性信息。在分布式環(huán)境下,沒(méi)有人能回避數(shù)據(jù)一致性問(wèn)題,我們對(duì)此充滿著敬畏。 一、引子 根據(jù)CAP原理,分布式系統(tǒng)無(wú)法在保證了可用性(Availability)和分區(qū)容忍性(Partition)之后,繼續(xù)保證一致性(Consistency)。我...

    wangjuntytl 評(píng)論0 收藏0

發(fā)表評(píng)論

0條評(píng)論

最新活動(dòng)
閱讀需要支付1元查看
<