簡體   English   中英

JMS超時或TimeToLive

[英]JMS Timeout or TimeToLive

我對Java EE和JMS相當陌生,並且正在考慮使用JMS進行實現。

考慮以下情形:

腳本

用戶點擊一個servlet。 然后將一條消息從此servlet放入JMS服務器/隊列中。 然后將響應發送回給用戶,說“消息已排隊”。

選項1

使用者/ MDB從JMS隊列接收消息並進行處理。 這是正常操作,很標准。

選項2

沒有消費者(無論出於何種原因),或者接收方處理消息的速度太慢。 因此,我希望隊列中的消息超時。 一旦超時,應發送電子郵件等(以電子郵件為例)。

閱讀我在QueuSender類中找到的API規范/ Java EE 6教程

void send(Message message, int deliveryMode, int priority, long timeToLive) 

因此,通過設置timeToLive消息將從隊列中逐出。 問題在於,沒有“接口/回叫”來知道消息已被逐出。 它只是消失了。 還是我弄錯了?

我想到的另一種方法是讓線程監視隊列並逐出“過期”的消息並將其從隊列中拉出。 但我認為這不可能嗎?

對此問題的任何見解將不勝感激。

您必須使用一些特定於實現的功能才能滿足您的要求。 JMS規范既沒有定義超時消息采取的動作,也沒有為您從隊列中輪詢消息時提供任何合理的條件選擇。

但是,大多數(如果不是全部)JMS實現確實提供了DLQ(死信隊列)的概念。 如果無法將消息傳遞給常規使用者或超時,則JMS實現將很可能將消息移至DLQ,而DLQ基本上也是具有自己的偵聽器的常規隊列。

因此,如果您設置兩個隊列Q1和Q2並將Q2配置為Q1的DLQ,則將在Q1上的偵聽器中進行常規請求處理,並為Q2實現一個附加的偵聽器以執行錯誤/超時處理。

通過JMS進行同步交互也可能對您有所幫助。 基本上在客戶端上,您:

  1. 發送具有相關性ID和生存時間的消息
  2. 使用相同的相關ID並指定超時(生存時間==超時,因此如果您將其視為無效,則它實際上是無效的)會收到一條消息(通常在同一線程中)

另一方面,服務器:

  1. 在傳入消息上必須獲取相關ID
  2. 為響應指定相關ID,同時將其發送回客戶端。 當然,服務器必須足夠快以適合超時/生存時間閾值。

因此,在客戶端,您始終可以確定所發送的消息發生了什么。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM