Skip to main content

🧣 排程與延遲訊息

本章節解析 ActiveMQ 的延遲投遞機制。透過 Scheduled Message Plugin,Producer 可指定訊息在未來某個時間點才被 Consumer 接收,適用於重試退避、定時任務與訂單超時等場景。

環境

1. 啟用 Scheduled Message Plugin

  • 檔案: /conf/activemq.xml
<broker xmlns="http://activemq.apache.org/schema/core" brokerName="localhost" dataDirectory="${activemq.data}">
<plugins>
<timeStampingBrokerPlugin zeroExpirationOverride="86400000"/>
<scheduledMessageBrokerPlugin/>
</plugins>
</broker>

2. 延遲投遞方式

2.1 訊息屬性

屬性說明範例
AMQ_SCHEDULED_DELAY延遲毫秒數後投遞60000(1 分鐘)
AMQ_SCHEDULED_PERIOD重複投遞間隔3600000(每小時)
AMQ_SCHEDULED_REPEAT重複次數5
AMQ_SCHEDULED_CRONCron 表達式排程0 0 9 * * ?(每天 9 點)

2.2 Java 範例

TextMessage message = session.createTextMessage("Order timeout check #1001");
message.setLongProperty("AMQ_SCHEDULED_DELAY", 30 * 60 * 1000L); // 30 分鐘後
producer.send(message);

2.3 Spring JmsTemplate

jmsTemplate.convertAndSend("ORDER.TIMEOUT", orderId, message -> {
message.setLongProperty("AMQ_SCHEDULED_DELAY", 1800000L); // 30 分鐘
return message;
});

3. 運作流程

延遲期間訊息存放在 Broker 內部排程目的地,不會出現在目標 Queue 的待處理列表中。

4. 應用場景

場景設定
訂單 30 分鐘未付款自動取消AMQ_SCHEDULED_DELAY=1800000
每小時同步報表PERIOD=3600000, REPEAT=-1
每天早上 9 點發送提醒AMQ_SCHEDULED_CRON=0 0 9 * * ?

5. 常見問題與排查

現象可能原因處理方式
延遲訊息立即被消費Plugin 未啟用加入 scheduledMessageBrokerPlugin
Cron 不觸發表達式格式錯誤使用 Quartz Cron 格式
Broker 重啟後延遲訊息遺失非持久化訊息設為 persistent delivery mode
排程佇列堆積大量延遲訊息監控內部排程目的地深度

6. 與其他文章的關聯