Spring中两个JMS侦听器具有相同的侦听器容器工厂时如何处理并发

问题描述

我应该在两个队列上侦听并以并发方式处理消息。我一瞬间不会处理超过10条消息。为了对此进行测试,我将DefaultJmsListenerContainerFactory 5-5如下配置:

@Bean
public ActiveMQConnectionFactory activeMQConnectionFactory() {
    ActiveMQConnectionFactory activeMQConnectionFactory = new ActiveMQConnectionFactory(broKER_URL);
    return activeMQConnectionFactory;
}

@Bean
public DefaultJmsListenerContainerFactory jmsFactory() {
    DefaultJmsListenerContainerFactory factory = new DefaultJmsListenerContainerFactory();
    factory.setConnectionFactory(activeMQConnectionFactory());
    factory.setSessionAckNowledgeMode(ActiveMQSession.INDIVIDUAL_ACKNowLEDGE);
    factory.setConcurrency("5-5");
    return factory;
}

听众如下:

@JmsListener(id = "queue1",destination = "QUEUE1",containerFactory = "jmsFactory")
@JmsListener(id = "queue2",destination = "QUEUE2",containerFactory = "jmsFactory")
public void test(ActiveMQTextMessage message) throws InterruptedException,JMSException {
    log.info("Received Task: " + message.getText());

    long randomLong = (long)(Math.random() * 500);
    Thread.sleep(randomLong);
    log.info("Slept for " + randomLong + "ms for "+ message.getText());

    message.ackNowledge();
}

每个侦听器都分配了5个消费者,还是在两个侦听器之间共享了5个消费者?如果前者是正确的,是否有任何配置可以共享5个使用者?

我使用两个for循环向两个队列发送了10个请求:

    for(int i = 0; i < 10; i++) {
        Queue1Sender.sendMessage("Queue1 Request: " + (i+1));
    }
    
    for(int i = 0; i < 10; i++) {
        Queue2Sender.sendMessage("Queue2 Request: " + (i+1));
    }

这是打印的日志:

 Received Task: Queue1 Request: 2
 Received Task: Queue1 Request: 3
 Received Task: Queue1 Request: 1
 Received Task: Queue1 Request: 4
 Received Task: Queue1 Request: 5
 Received Task: Queue2 Request: 1
 Received Task: Queue2 Request: 2
 Received Task: Queue2 Request: 3
 Received Task: Queue2 Request: 4
 Received Task: Queue2 Request: 5
 Received Task: Queue2 Request: 6
 Received Task: Queue1 Request: 6
 Received Task: Queue2 Request: 7
 Received Task: Queue2 Request: 8
 Received Task: Queue1 Request: 7
 Received Task: Queue1 Request: 8
 Received Task: Queue1 Request: 9
 Received Task: Queue1 Request: 10
 Received Task: Queue2 Request: 9
 Received Task: Queue2 Request: 10

我无法确定消费者是否正在共享。有更好的测试策略吗?

解决方法

您将获得两个具有该配置的完整侦听器容器;每个都有5个消费者。