成人无码视频,亚洲精品久久久久av无码,午夜精品久久久久久毛片,亚洲 中文字幕 日韩 无码

資訊專欄INFORMATION COLUMN

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

Mertens / 990人閱讀

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

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

GitHub地址

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

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

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

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

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

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

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

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

支持spring-boot,支持單個任務(wù)運行多個實例(使用擴展后綴)。

主要改動

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

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

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

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

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

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

說明:

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

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

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

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

模塊架構(gòu)


代碼實戰(zhàn) 定義非動態(tài)的定時任務(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 !=========");
    }
}
    
定義動態(tài)的定時任務(wù)
// 定義任務(wù)實體
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()))) {
            // 上報的在定時任務(wù)中不執(zhí)行
            throw new SchedulerTaskExecuteException("任務(wù): " + model.getTaskName() + ", 屬于上報任務(wù), 禁止在定時任務(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 啟動類

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


    
        
            
            
            
            
            
            
            
        
    





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

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

ConsoleManager.addScheduleTask(TaskDefine taskDefine);

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

ConsoleManager.delScheduleTask(TaskDefine taskDefine);

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

ConsoleManager.updateScheduleTask(TaskDefine taskDefine);

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

ConsoleManager.queryScheduleTask();

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

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

關(guān)于

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

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

轉(zhuǎn)載請注明本文地址:http://m.hztianpu.com/yun/67869.html

相關(guān)文章

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

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

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

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

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

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

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

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

    null1145 評論0 收藏0
  • 有贊業(yè)務(wù)對賬平臺的探索與實踐

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

    wangjuntytl 評論0 收藏0

發(fā)表評論

0條評論

閱讀需要支付1元查看
<