Java透過DelayQueue實現的延遲任務佇列排程服務

背景

在我們的系統中,有些時候需要用到一些延遲任務,比如我們的系統A依賴於另外一個系統B,只有這兩個系統建立連線後,才能進行業務操作。 系統A把一些策略執行所需的引數、環境、指標資料發給B, B進行策略服務執行,獲取結果後通知系統A。 系統A在與系統B建立連線後首先發送一些基礎的系統引數,然後才可以傳送正常的業務資料。 所以要求我們在兩個系統建立連線成功後,稍微延遲一點時間傳送系統引數。 其中原因是:系統建立成功後,系統A立即傳送引數,系統B有時候會收不到,因為系統連線基於tcp建立連線後進行一些認證、初始化環境操作,所以tcp連線成功後,業務系統的環境還沒有準備好。 因此我們需要引入一個延遲任務排程服務,在監聽到連線成功後, 建立一個延遲任務,放入佇列裡面,然後進行排程執行。

Java透過DelayQueue實現的延遲任務佇列排程服務

因為對延遲任務排程佇列要求很簡單,不需要做故障恢復、資料持久等安全性保障,所以就引入了單機版的任務排程服務實現。 我們第一版本基於java提供的DelayQueue實現,後續有第二版本支援任務持久化、故障恢復、分散式等操作。 本文先介紹基於DelayQueue怎麼實現一個延遲任務排程服務。

實現

首先定義一個抽象延遲任務類AbstractDelayedTask, 具體要實現的延遲任務透過繼承該類就可以被排程。

Java透過DelayQueue實現的延遲任務佇列排程服務

抽線出來的延遲任務類

延遲排程服務實現類DelayScheduleService, 該類透過DelayQueue實現延遲任務的排程執行。

Java透過DelayQueue實現的延遲任務佇列排程服務

延遲排程服務類

用例

在springMvc裡面直接宣告一個bean物件,如下:

Java透過DelayQueue實現的延遲任務佇列排程服務

Java透過DelayQueue實現的延遲任務佇列排程服務

特別需要注意的是:配置該bean的3個屬性,如下:

init-method=“init”

destroy-method=“shutdown”

scope=“singleton”

宣告一個延遲任務實現類

該任務類繼承AbstractDelayedTask,實現其抽象方法process()

Java透過DelayQueue實現的延遲任務佇列排程服務

在需要的地方,把該延遲任務放入到佇列裡面去,如下:

logger。info(“=======>scenarioDiscoveryStatus==== 已連線交易系統”);//加入延遲任務,預設10s,具體可以在實現類裡面定製,也可以透過建構函式指定delayScheduleService。put(new DelaySendControlRuleTask(controlRuleConfigService));

這樣就完成了一個延遲任務排程服務了,使用非常簡單。

缺點

第一版本實現的比較簡陋, 時間精度不細緻、不支援故障恢復、 不支援資料持久化、不支援分散式,適用於系統對延遲要求比較低,任務延遲精度低的場景下使用。 其他場景須慎用。