【问题标题】:question on JMS receive()/MessageListener precedence关于 JMS receive()/MessageListener 优先级的问题
【发布时间】:2011-10-19 19:29:13
【问题描述】:

如果我为MessageConsumer 设置MessageListener 对象,然后在该消费者上调用receive(),会发生什么?提供者会将消息交给receive(),还是会在MessageListener 对象处理消息时继续被阻止?

【问题讨论】:

    标签: java jms


    【解决方案1】:

    你会得到一个异常,因为 Session 必须处于异步或同步模式。从 JMS 规范的 4.4.6 开始

    会话的单线程控制限制的一个后果是 与消息侦听器的会话也不能用于同步接收 消息。会话专用于用于控制的线程 传递给消息侦听器或专用于启动的控制线程 通过客户端代码。尝试在同一个会话中合并两者是错误的。

    【讨论】:

      【解决方案2】:

      我很难想象这样做是有意义的情况。

      假设你的 receive() 没有优先级。然后估计没有效果。

      假设你的 receive() 确实有优先权。在您的接收者收到消息后,您期望会发生什么?大概在您再次调用接收之前,消息消费者将接收消息?在这种情况下,您的系统行为实际上是一个巨大的竞争条件,消息的确切到达时间会导致不同的行为。

      你必须能够做得比这更好。有一个“自适应”的 MessageConsumer,你也许可以控制它的行为。

      【讨论】:

      • djna:感谢您的回答。我不一定会想象这种情况适用。这更多地与某些提供商如何处理这种情况有关。我认为即使之前已经为消费者提供了 MessageLsitener 对象,也有可能在某个地方无意中调用 src 文件中的“receive()”。在这种情况下,提供者将如何反应?
      • 提供者将抛出 JMSException,例如当进行 receive() 调用时,WebSphere MQ 将抛出“JMSCC0033:异步使用会话时不允许同步方法调用”
      猜你喜欢
      • 2015-03-12
      • 1970-01-01
      • 2011-06-30
      • 2021-07-20
      • 1970-01-01
      • 1970-01-01
      • 2021-03-17
      • 1970-01-01
      • 2022-11-16
      相关资源
      最近更新 更多