JMS TextMessage,JMS_BEA_SELECT消息选择器,事务会话和确认模式

时间:2011-08-18 05:07:30

标签: java spring tomcat jms weblogic

我的应用程序在Tomcat下运行,有许多Spring DefaultMessageListenerContainer监听在Oracle 11g Weblogic服务器下运行的许多不同的JMS队列。

DefaultMessageListenerContainer配置为.. well ..默认为sessionTransacted = falsesessionAcknowledgeMode = AUTO_ACKNOWLEDGE。我的应用程序收到的消息类型是javax.jms.TextMessage。消息的实际主体(message.getText())是XML字符串。

当需要将多个应用程序实例(开发框,测试框等)指向同一个JMS服务器时,我遇到了问题,因此一旦消息进入队列,就不知道哪个服务器将使用它(我相信首先运行receive()方法的那个。问题是任何给定的应用程序实例只对专用于该特定应用程序实例的消息感兴趣,因此对于当前配置,大多数消息会丢失(由其他应用程序实例使用并在消息处理业务逻辑中被忽略)。

我无法控制JMS服务器实现,但我可以强制它将消息体中的特定XML元素设置为特定于应用程序实例的值,因此我可以读取它并决定应该使用它的应用程序实例。

最自然的方法是在messageSelector上设置DefaultMessageListenerContainer属性,因此决定在JMS服务器上哪个消费者应该接收什么消息。我还了解了与XML消息类型一起使用的Weblogic特定JMS_BEA_SELECT消息选择器表达式。不幸的是,它似乎不适用于带有XML负载的javax.jms.TextMessage消息(或者至少我无法使其工作)。我正在尝试以下表达式而没有运气:

<property name="messageSelector" value="JMS_BEA_SELECT('xpath', '//Event/CorrelationID/text()') = 'MY_SELECTOR_TEST_3'"/>

根据this article,其他选项是:

  1. 使用事务处理会话,然后回滚会话,以便消息返回队列并可被其他应用程序实例使用。
  2. 在创建会话时使用Session.CLIENT_ACKNOWLEDGE,然后恢复会话,以便消息返回队列并被其他应用程序实例使用。
  3. 我知道我需要在sessionTransacted上将sessionAcknowledgeModeDefaultMessageListenerContainer设置为非默认值(值是什么?),然后在消息处理器代码中回滚会话(选项1) )或者不要拨打message.acknowledge()(选项2)。

    看起来DefaultMessageListenerContainer控制消息处理/会话生命周期。我该如何定制?

1 个答案:

答案 0 :(得分:0)

回滚的解决方案看起来很奇怪。 设置消息选择器就足够了。我没有使用BEA JMS实现,但我猜你可以注意常规的“SELECT”并从头部中选择。

<property name="messageSelector" value="CorrelationID='MY_SELECTOR_TEST_3'/>

您是否在通信点(服务器,客户端)的两侧工作以控制相关ID?