簡體   English   中英

如何延遲JMS消息發送?

[英]How do I delay JMS Message sending?

如何延遲JMS消息發送或進行不確定的時間?

我正在使用Weblogic,如你所知,在JMS發送之后,接收器將異步處理消息,但是,此時或者有時外部資源還沒有為接收器做好准備,因此,我想要一些檢查邏輯來延遲發送或處理消息。 我想例如:我將消息放入待處理隊列然后經常檢查資源可用性,一旦發送或繼續消息?

大家都知道Weblogic是支持這個還是如何實現它?

你絕對可以在JMS中執行此操作,只需使用本地隊列來存儲消息; 當接收器可用時發送到遠程隊列。

選項1(理想,安全)

1)首先,在WebLogic, LocalJMSServer創建JMS服務器。

2)確保僅將此資源僅定位到本地WebLogic實例。

3)創建一個隊列, tempQueue ,用於LocalJMSServer

4)您的應用程序始終向tempQueue發送消息。 由於該隊列是本地的,因此消息只是位於隊列中,並且它們也是持久的,這在服務器崩潰的情況下很好。

5)您需要在WebLogic中使用單獨的JMSServer配置來托管remoteQueue因為該隊列將定位到遠程WebLogic實例。

6)您的應用程序會定期檢查遠程接收器的可用性:

   if( receiverIsAvailable()){
    ...
   }

...當接收器可用時,將消息從tempQueue出隊並發送到remoteQueue ...

Queue tempQueue = (Queue) ctx.lookup("tempQueue");
QueueSession queueLocalSession = 
  queueConn.createQueueSession(false,
     Session.CLIENT_ACKNOWLEDGE);  
QueueReceiver queueReceiver = queueLocalSession.createReceiver(tempQueue);
TextMessage localMessage = (TextMessage) queueReceiver.receive();

//send to remote queue
Queue remoteQueue = (Queue) ctx.lookup("remoteQueue");
QueueSender queueSender = queueRemoteSession.createSender(remoteQueue);
Message newMessage = queueRemoteSession.createTextMessage(
  localMessage.getText());
queueSender.send( newMessage);

//now acknowledge the message since we safely sent to remoteQueue
localMessage.acknowledge(); 

我喜歡這種方法,因為它完全是交易性的; 如果出現任何問題,只要您使用PERSISTENT模式,就不會丟失消息。 此外,從tempQueue提取消息時,必須使用同步接收器(如上所述),因為它會立即處理來自本地隊列的消息,所以不能使用onMessage()

選項2(更簡單,更安全)

您還可以使用內存中隊列(而不是JMS)在本地存儲消息內容:

ArrayBlockingQueue queue = new ArrayBlockingQueue<String>();
queue.add(messageContents1);
queue.add(messageContents2);
...

您的應用程序檢查接收端的資源可用性,如果可用,只需出列並立即發送真實的JMS消息:

if( receiverIsAvailable()){
   while(!queue.isEmpty()){
      Message message = session.createTextMessage();
      message.setText(queue.take());
      queueSender.send(message);
   }
}

這種方法的問題是存儲在queue中的消息駐留在內存中; 如果發件人崩潰,你將丟失這些消息。

希望能幫助到你!

通常,為了延遲接收消息,直到資源准備就緒,不會調用connection.start()方法。 這是邏輯:

  1. 接收器啟動並建立連接並設置所有JMS資源。
  2. 不調用connection.start()。
  3. 等待其他資源初始化
  4. 使用connection.start()啟動JM連接

您甚至可以使用此方法暫停消息偵聽器接收的消息。 這種技術在使用JMS的GUI工具中非常常見。

假設您使用的是Websphere MQ,我認為它不受支持。

JMS 2.0確實支持延遲傳遞[1]消息,但沒有更多信息,很難回答。

[1] https://java.net/projects/jms-spec/pages/JMS20FinalRelease#What_s_new_in_JMS_2.0

如果外部資源未准備好,您可以讓接收器阻塞。 由於接收器“忙”,在阻塞時不會再從隊列中取出消息。

您是否查看了WebLogic服務器中配置的JMS對象的交付時間設置?

Oracle WebLogic文檔

暫無
暫無

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

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