删除JMS消息属性

时间:2014-01-17 10:16:17

标签: java jms tibco-ems

我正在编写一个Java批处理,它是从队列(Oracle AQ)侦听消息并将它们发送到另一个队列(Tibco EMS),在那里它们由Tibco进程(BW)处理。

问题是Oracle AQ驱动程序会自动向消息添加一些属性(JMSXGroupID,JMSXGroupSeq),这些属性在由Tibco进程处理时会导致错误,因为它们具有错误值:JMSXGroupSeq应该是int但是设置为null。尝试解析消息属性时,Tibco会出错...

所以我想从所有消息中只删除这两个属性,但似乎jms api只提供clearProperties()方法,但没有单个属性remove方法(我使用的是javax.jms.Message接口) )。

目前,我可以看到两种解决方案:

  1. 为这两个属性设置正确的值,我假设他们会这样做 Tibco不再使用

  2. 读取所有属性并重建消息,而不会导致问题。但这种做法非常难看......

  3. 有没有人有其他解决方案?

2 个答案:

答案 0 :(得分:9)

无法编辑/清除某些属性。我们需要调用clearProperties方法,如here所述,以获得写访问权:

生成(发送)消息后,其属性将变为只读;属性无法更改。虽然消费者可以使用属性访问器方法(getProperty())读取属性,但是他们无法使用任何mutator方法(setProperty())修改属性。如果使用者尝试设置属性,mutator方法将抛出javax.jms.MessageNotWriteableException。

收到消息后,可以更改其属性的唯一方法是使用clearProperties()方法清除所有属性。这将从邮件中删除所有属性,以便添加新邮件。发送邮件后,无法修改或删除单个属性。

答案 1 :(得分:0)

javax.jms.Message接口的具体类实现中将有一个函数public void removeProperty(String name)。此类是提供者特定的(在您的情况下为Tibco EMS)。由于它是封闭源,我无法确定该函数的存在。但它存在于HornetQ中。它可用于重置特定的标题属性。

除此之外我选择1是最好的。您将其设置为Tibco EMS的Message头解析器可接受的某个非null值。