0

ActiveMQ 目的两种消费方式:

  1. 通过调用异步消费MessageListener
  2. 通过入队同步消费,让客户端调用receive()

首先我使用的是@JmsListener. 这个注解使 Spring 创建一个异步消费者,即它receive()在队列上创建一个。

我尝试使用MessageListener,但 Spring 继续创建一个同步消费者。

所以我查看了 Spring JMS 和 ActiveMQ 代码。

创建异步使用者的唯一方法是ActiveMQSession.createConsumer使用 a调用MessageListener

public MessageConsumer createConsumer(Destination destination, MessageListener messageListener) throws JMSException {
    return createConsumer(destination, null, messageListener);
}

然后我在 Spring JMS 上寻找类似的调用,但我什么也没找到。

目前,我认为 Spring JMS 无法创建带有 a 的消费者MessageListener,即创建同步消费者(如上面的第一种消费方式)。

我对吗?

4

2 回答 2

0

Spring JMS(顾名思义)使用 JMS API。它不直接调用任何 ActiveMQ 代码,因此 ActiveMQ 实现细节在这里无关紧要。您引用的createConsumer方法不是JMS API 的一部分,因此 Spring JMS 没有理由调用它。ActiveMQSession

您应该查看 Spring JMS 代码中的用途,javax.jms.MessageConsumer.setMessageListener(MessageListener listener)因为这是MessageListener通过 JMS API 设置的方式。

于 2019-09-16T14:33:15.703 回答
0

setMessageListener 方法是从 Spring JMS 中的 SimpleMessageListenerContainer 调用的(不在默认容器中):

/**
 * Message listener container that uses the plain JMS client API's
 * {@code MessageConsumer.setMessageListener()} 
 * [...]
 */
 public class SimpleMessageListenerContainer

文档说这个简单的容器不支持 XA 事务: 见这里

不幸的是,我需要它。

于 2019-09-17T06:06:13.267 回答