2015-09-15 65 views
1

我們使用Websphere MQ8並考慮使用持久主題來實現發佈和訂閱模式。是否有修改持久JMS主題消息的工具?

我們使用的隊列已經和Hermes JMS-Browser糾正錯誤的隊列消息。

我知道您可以使用愛馬仕訂閱主題,但我認爲您無法訪問和修改已針對特定客戶端保留的消息。

所以我想知道 - 當客戶端無法使用特定客戶端應用程序的持久消息時,如何處理問題,例如,因爲郵件格式錯誤?

您是否必須刪除此客戶的未傳送郵件?還是有一些工具可以做到這一點?

回答

0

當客戶端無法使用特定客戶端應用程序的持久消息時,如何處理問題,例如, 因爲消息格式錯誤?

消費應用(客戶端)應該有適當的異常處理 ,它應該扔掉所有的壞/毒藥消息。

是否必須刪除該客戶端的所有未送達的郵件?還是有一些工具可以做到這一點?

的消息將自動被MQ服務器一旦 TTL(存活時間)期滿被刪除。我們不能手動刪除這些郵件,因爲它們屬於/意爲原始客戶端(這是一個耐用的 訂戶)的 。

下面的鏈接很好地解釋了在JMS持久訂閱的概念: https://docs.oracle.com/cd/E19798-01/821-1841/bncgd/index.html

另外我已經提供了工具,它記錄(不刪除)以下示例代碼由耐用的消息訂閱主題:

InitialContext ctx = new InitialContext(); 
    Topic topic = (Topic)ctx.lookup("myJMSTopic1"); 

    TopicConnectionFactory connFactory = (TopicConnectionFactory) ctx.lookup("topicConnFactory"); 
    TopicConnection topicConn = connFactory.createTopicConnection(); 
    topicConn.setClientID("myToolId1"); //Use a different client id than original subscriber 

    TopicSession topicSession = topicConn.createTopicSession(false, Session.AUTO_ACKNOWLEDGE); 

    TopicSubscriber topicSubscriber = topicSession.createDurableSubscriber(topic, "myClientExistingDuraSubName"); // this is where you have to provide the original client's durable subscription name 

    while(true) { 
     Message message = topicSubscriber.receive(); 
     TextMessage txtMsg = (TextMessage)message; 
     logger.info(txtMsg.getText()); 
    } 
+0

我的問題是,當你得到一個XA事務回滾例如從你的數據庫中,你不能刪除中毒的消息,對吧?在這種情況下,主題也會回滾。然後一些工具會很好。聽起來像是一個很常見的問題,所以想知道它沒有標準的解決方案... – Dirk

+0

我明白了你的意思,你可以添加具有這個XATransaction代碼的MDB方法的代碼(在你的查詢中)嗎? – developer

+0

現在我們有MDB在等待隊列並寫入數據庫。但是聽代碼時代碼會非常相似。你有什麼想法? – Dirk

相關問題