【问题标题】:Read specific message from queue based on Correlation ID根据相关 ID 从队列中读取特定消息
【发布时间】:2015-05-05 05:09:55
【问题描述】:

我有一个 mdb 连接到 websphere 的侦听器端口,它将从队列中读取消息并将其保存到数据库。

现在在使用 sessionBean 发送请求时,我在消息中添加了相关 ID。

msg.setJMSCorrelationId(theID);

我当前的MDB代码是

onMessage(Message message) {
//it will read the message and insert to db
}

我希望我的 MDB 只收听具有我在发送消息时设置的相关 ID 的消息。

有人可以建议如何做到这一点吗?

【问题讨论】:

  • JMSCorrelationID 通常应该是唯一的,因为它代表您正在响应的消息的 id。在您的情况下,它应该是自定义消息属性,例如 myMessage.setStringProperty("NumberOfOrders", "2")

标签: java ejb jms websphere message-driven-bean


【解决方案1】:

在您的 mdb 的 ejb-jar.xml 中使用消息选择器。消息选择器用于仅接收满足特定条件的那些消息。您的标准是关联 ID,它是一个预定义的字段。

<activation-config-property>
            <activation-config-property-name>messageSelector</activation-config-property-name>
            <activation-config-property-value><![CDATA[JMSCorrelationID = 'value']]></activation-config-property-value>
        </activation-config-property>

注意:恕我直言,将关联 ID 设置为消息选择器是个坏主意,因为在需要使用 JMS 关联 ID 的用例中,每条消息通常都有自己的值。您可能最终需要每条消息的 MDB :)

【讨论】:

  • 这就是我所做的。在传递correlationID时,我使用msg.setJMSCorrelationID传递一个硬编码值ID:414243,我设置了这个值。现在正如你所说,我在我的 xml 文件中添加了上面的代码,而不是使用上面的硬编码值。在我的 MDB 中,我添加了查找特定队列的代码,然后使用 session.createReceiver(queue, messageSelector) 其中 messageSelector 是 JMSCorrelationID='"ID:414243"' 然后是 receiver.receive(50000)。我仍然无法读回消息。我错过了什么吗?
猜你喜欢
  • 2015-10-11
  • 1970-01-01
  • 2021-03-11
  • 2012-10-22
  • 2013-08-06
  • 2011-07-10
  • 2013-10-22
  • 1970-01-01
  • 2013-09-13
相关资源
最近更新 更多