【问题标题】:JMS selector strange behaviourJMS 选择器奇怪的行为
【发布时间】:2015-07-13 00:10:27
【问题描述】:

在 JMS 中考虑以下伪代码:

发件人:

    QueueSender qs = session.createSender(queue);
    int i = 0;
    while(i < 10)
    {   
        TextMessage msg = session.createTextMessage();
        msg.setText(""+i);

         msg.setIntProperty("value", i);

        qs.send(msg);
        i++;
    }

接收者:

String sel = "value >2";
QueueReceiver qr = session.createReceiver(q,sel);

while(true)
{
 TextMessage tm = (TextMessage) qr.receive();
 System.out.println(tm.getText);
}

我原以为消费者不会消费/打印任何东西,因为他感兴趣的消息被消息 0、1、2 阻止,而这些消息没有被任何消费者拉取。

我看到的是消费者打印出其选择器选择的所有消息...

这是 JMS 的正确行为吗?
那是在某处记录的吗?

谢谢。

【问题讨论】:

  • 什么是qs?你能说明它是如何被初始化的吗?
  • 尝试将 value &gt;2 更改为 value&gt;2 以确保它不是解析错误。
  • 还是一样的输出
  • 至此,不得不说,输出如预期。选择器不会阻止其他消息被读取。它只会导致侦听器忽略这些消息并继续其余的。您可以将接收者打印的输出添加为问题的一部分吗?查看我的回答,如果您有任何疑问,请告诉我。

标签: java queue jms selector


【解决方案1】:

我本来希望消费者不要消费/打印任何东西 因为他感兴趣的消息被消息屏蔽了 0,1,2 未被任何消费者拉取

这个假设是不正确的。当您在JMS 中使用选择器时,不满足选择器表达式的消息将不会传递到QueueReceiverQueueReciever 将继续读取所有满足选择器表达式的消息。

我相信您的输出包含从 3 到 10 的数字。。这是预期的行为。请参阅createReceiver 方法的文档。

【讨论】:

  • 是的,输出就是这样,所以 JMS 队列不是正确的 FIFO 队列?
  • @GionJh JMS 从不曾经是或打算成为 FIFO,它确实完全保证顺序
  • 我想用 bucket 或 set 来代替 queue 会更合适...谢谢 ;)
  • @GionJh 我无法概括这一点,因为不同的提供商可能会以不同的方式实现队列。话虽如此,如果我已经回答了您的直接问题,请不要忘记投票并接受答案。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-10-24
  • 1970-01-01
  • 1970-01-01
  • 2013-01-29
  • 2014-05-28
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多