ActiveMQ的延遲和定時投遞

2021-10-07 03:53:49 字數 1945 閱讀 4393

在介紹activemq的延遲和定時投遞之前,這裡我們先來回顧下在併發程式設計中介紹的堵塞佇列(二)—— delayqueue實現限時訂單,其中我們就提到了乙個執行場景,即網上購物下單未支付,等支付時間到了之後的處理,最簡單的方式肯定就是輪詢資料庫了,但是輪詢資料庫的話肯定有很多的缺點,如造成資料庫壓力過大,訂單會存在一定的延時情況。

然後為了避免上述的缺點,我們使用了delayqueue實現限時訂單,就很好的避免了上述最主要的兩個缺點,那麼使用delayqueue就不存在缺點了麼,肯定也是有的,如應用重啟怎麼辦啊,delayqueue中的訂單資訊都是儲存在記憶體中的,如果應用重啟那麼記憶體中的資料肯定就丟失了,這裡我們就必須在應用重啟的時候取掃一遍資料庫,將未支付已過期的訂單進行處理,然後再進未支付未過期的訂單再次加入delayqueue,不過這裡的過期時間需要做出相應的處理。

另外除了應用重啟,還存在擴充套件性的問題,隨著我們的業務逐漸的增大,訂單系統可能會進行集群化,那麼delayqueue來處理限時訂單會存在問題麼,肯定也是有的,還是上述的問題,就是在集群化的情況下,如果應用重啟了,每個服務讀取資料庫掃瞄一遍,這裡每個服務都會把所有的訂單都拉到自己的delayqueue佇列中,這樣就會造成重複處理(如果是非冪等的操作就會出現問題)。

上述我們又該如何解決呢?我們就必須給每個訂單加上機器碼,來標註它是屬於哪個服務來處理的,如ip位址等,這樣服務重啟時,每個服務就只去取屬於自己處理的訂單,但是這樣的話,要是其中一台服務宕機的話,那麼屬於該服務的訂單就不會被處理了,這裡我們就需要去資料庫中該服務訂單的機器碼進行修改,讓其他服務來代替進行處理。

看完上述的過程,是不是發現存在很多的問題,並且處理還挺麻煩,最後甚至還需要去手動修改訂單資訊,讓其他服務進行處理,這裡我們能不能使用activemq來解決呢?

肯定是可以的,我們可以在activemq來啟動延遲和定時投遞,首先我們需要在activemq的配置檔案acttivemq.xml中,進行相關的配置,在

中加上schedulersupport="true",以用來增加延遲和定時投遞支援,如下:

然後我們在**中傳送訊息的時候,就需要額外的新增一些描述訊息定時排程方式的引數,如下:

在訊息傳送端只需上述即可(當然還有更多的時間排程方式),其餘操作和之前一樣,然後消費者也不需要進行修改,不過這裡我們為了看效果,將接受時間大約出來,結果如下:

那麼除了上述我們實現的延遲訊息,那麼還有哪幾種排程方式呢,如下:

如上述我們只是簡單的延遲5秒後進行投遞,這裡我們就還可以進行複雜點的設定,如我們將上述訊息不僅延遲5秒,在重**送一次,間隔時間為10秒,如下:

可能你認為上述太過於麻煩,或者有著更為複雜的排程策略,那麼我們還可以使用cron表示式來進行設定,可以設定以秒、分鐘、天等單位進行迴圈,或者進行定時進行投遞,其方式也比較簡單,如下:

cron和其餘的也是可以一起使用的,如是上,每一分鐘執行一次,會進行重發一次,然後啟動後,我們還可以進入activemq的控制台進行檢視,如下:

ActiveMQ中的延遲投遞和定時投遞

5.4版的activemq在activemq訊息 中內建了乙個可選的永續性排程程式。通過在 xml配置 中將broker schedulersupport屬性設定為true 可以啟用此功能。activemq客戶端可以通過使用以下訊息屬性來利用延遲傳遞。官網 修改activemq.xml,在broke...

定時任務和延遲任務

crontab u 使用者 e 這個命令編輯的檔案是 var spool cron 使用者 每分鐘 分鐘 小時 天 月 周 2 每兩分鐘 08 17 每天早上8點 下午5點每分鐘 08 17 1,15 每月1號和15,早上8 下午5 每分鐘 08 17 1,15 3 三月的1號和三月的15,早上8 ...

Linux 系統延遲和定時機制

at 命令 at 命令可以指定某一任務在將來的特定時間執行。該作業可能是一次 備份 對您系統的檢查或者特定時間傳送的通知。那些需要花費很長 時間才可完成的作業正適合 at 命令。僅需使用 at 命令將任務設定 為在一分鐘或兩分鐘之後執行。然後您便可以安全登出 因為該任務會 在與 shell 會話斷開...