2014-01-17 98 views
1

我正在寫一個正在監聽來自隊列(Oracle AQ)的消息並將它們發送到另一個隊列(Tibco EMS)的Java批處理,它們由Tibco進程(BW)處理。刪除JMS消息屬性

問題是,Oracle AQ驅動程序會自動向消息(JMSXGroupID,JMSXGroupSeq)添加一些屬性,這些屬性由Tibco進程處理,因爲它們具有錯誤值:JMSXGroupSeq應該是int,但設置爲null。嘗試解析消息屬性時,Tibco會陷入錯誤...

因此,我想從所有消息中僅刪除這2個屬性,但似乎jms api只提供clearProperties()方法,但沒有單個屬性remove方法(我正在使用javax.jms.Message接口)。

現在,我可以看到兩個解決方案:

  1. 設置正確的值到這2個屬性,我假設他們將 不會被進一步的Tibco

    使用
  2. 讀取所有屬性並重構消息而不引起問題。但這種做法是非常難看的...

有沒有人有任何其他解決方案?

回答

4

無法編輯/清除某些屬性。我們需要調用如here所述的clearProperties方法來獲得寫入訪問權限:

一旦生成(發送)消息,其屬性就變爲只讀;屬性不能改變。雖然消費者可以使用屬性訪問器方法(getProperty())讀取屬性,但它們不能使用任何mutator方法(setProperty())來修改屬性。如果消費者嘗試設置屬性,則mutator方法將引發一個javax.jms.MessageNotWriteableException。

一旦收到消息,其屬性可以改變的唯一方法是通過使用clearProperties()方法清除所有屬性。這將刪除消息中的所有屬性,以便可以添加新的屬性。發送郵件後,不能修改或刪除單個屬性。

0

在javax.jms.Message接口的具體類實現中會有一個函數public void removeProperty(String name)。這個班級是提供者特定的(Tibco EMS在你的情況下)。由於它是封閉的源,我不能確定該函數的存在。但它存在於HornetQ中。它可以用來重置特定的頭部屬性。

除此之外,我的選擇1是最好的。您可以將其設置爲Tibco EMS的消息頭解析器可接受的非空值。

+0

感謝您的回覆。我試過這個解決方案,但得到了一個javax.jms.MessageNotWriteableException。我發現消息頭屬性受到保護,您需要調用clearProperties()來獲得寫入權限。以下是一些解釋:[鏈接](http://my.safaribooksonline.com/book/programming/java/0596000685/message-properties/appc-4-fm2xml)。所以我現在不得不採取第二種解決方案,但我們正在等待甲骨文的解答,以解決不正確標題值的主要問題。 – slavogiez