我可以在MessageConsumer上注册一个监听器,然后调用receive()方法吗? (JMS)

时间:2016-05-19 17:54:33

标签: java concurrency jms listener consumer

我想知道我是否可以在MessageConsumer上注册一个监听器然后调用receive()方法。我知道这听起来并不像是一个实际的场景,但知道它会很有趣。 JMS规范是否允许这样的东西?

我知道Session是一个单线程上下文,它的监听器对消息的调度将是顺序的,但我可以想象实际处理我的注册监听器的线程将会这样做,它必须是一些线程JMS提供程序创建的。这意味着创建消息使用者的线程是独立的,并且可以同时侦听消息。我刚刚说的是对的吗?在那种情况下会发生什么?

2 个答案:

答案 0 :(得分:1)

您对线程问题的分析正是我的想法所在。由于2个线程与一个会话交互,我认为你遇到了麻烦。

好的,我在JMS 1.1规范中查了一下。当我读到它时,有两位说话。

  1. 4.5 - “客户可以同步接收消费者的消息,也可以让提供商在到达时异步提供消息。”是/或,而不是两者。
  2. 4.4.6 - “如果已经有一个客户端控制线程等待在同一会话中接收消息,则客户端使用控制线程尝试同步接收消息是错误的。”我认为消息监听器是已经等待在同一会话上接收的另一个线程。

答案 1 :(得分:1)

据我所知,JMS规范中没有描述您的场景。所以留给JMS实现。例如,在IBM MQ的情况下,在附加消息侦听器之后的接收调用将抛出带有MQRC_HCONN_ASYNC_ACTIVE返回码的异常。