【问题标题】:JMS Queue with 2 Listeners带有 2 个侦听器的 JMS 队列
【发布时间】:2013-06-16 05:22:42
【问题描述】:

我有一个关于 JMS 队列的问题。

我已经实现了一个 jms 发送方/接收方,使用共享队列作为它唯一可用的队列,也是我唯一可以使用的队列。

我现在面临的问题是,由于这是先到先得,我无法保证我从生产者发送的消息将由我的消费者而不是共享此队列的其他消费者消费,反之亦然。所以我正在消费其他应用程序的消息,他们正在消费我的消息。

有没有一种方法可以让我只收听我的消息而不是从队列中消耗它们,或者这更像是一个主题实现?

或者也许我可以明确设置一个只有我的消费者才能使用的标识符。

我的主要代码:

public class AsyncReceiver implements MessageListener, ExceptionListener
{
public static void main(String[] args) throws Exception
{                                                                          
    //create queue factory
        factory = new TibjmsQueueConnectionFactory(serverUrl);
        //create queue connection
        queueConn = factory.createQueueConnection(userName, password);
        queueConn.setExceptionListener(this);
        //create queue session
        session = queueConn.createQueueSession(false, Session.AUTO_ACKNOWLEDGE);

        //receive message by QueueReceiver
        final Queue queue = session.createQueue(queueName);
        final QueueReceiver queueReceiver = session.createReceiver(queue);
        queueReceiver.setMessageListener(this);
        queueConn.start  ();                                                                      
  }

【问题讨论】:

    标签: java jms jms-topic


    【解决方案1】:

    您应该使用 JMS 选择器。每个 JMS 消息都可以包含您在发送方发起的属性。

    消息消费者可以注册到指定选择器的 JMS 目标(队列或主题) - 类似 SQL 的语句,用于解释它想要使用哪些消息。因此,您可以指定您的应用程序特定属性,然后只接收相关消息。

    【讨论】:

    • 感谢@AlexR 的回复,您能举个例子说明我会如何做到这一点吗?这是在消息本身中设置的,而不一定是发件人的连接?在接收器上,选择器是在创建队列接收器时指定的? final QueueReceiver queueReceiver = session.createReceiver(queue, "JMS_SELECTOR");
    【解决方案2】:

    您可以使用如下所示的消息选择器

    queueReceiver = queueSession.createReceiver(responseQueue, "JMSCorrelationID='" + requestMessage.getJMSCorrelationID() +"'");

    这里我使用 JMS 相关 ID 来识别我需要的正确消息。 请注意,过滤器仅适用于消息头和消息属性。 它不适用于消息内容。

    消息头和属性的详细信息:http://docs.oracle.com/javaee/1.4/tutorial/doc/JMS4.html#wp79367

    如果您需要根据消息内容进行过滤,您可能必须使用 QueueSession.MANUAL_ACKNOWLEDGE 模式并确认您想要的消息。在这种情况下,应用程序必须具有根据内容识别消息的逻辑。虽然不是理想的设计。

    【讨论】:

    • 谢谢@SMS Krishnan,关于你的例子,当这真的是初始化的一部分时,你怎么知道 requestMessage.getJMSCorrelationID() ?您是否在发布商方面进行了设置?
    猜你喜欢
    • 2015-12-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-01-21
    • 2019-09-02
    • 1970-01-01
    相关资源
    最近更新 更多