简体   繁体   中英

How is concurrency handled where two jms listeners have the same Listener Container Factory in Spring

I'm supposed to be listening on two queues and processing the messages in a concurrent manner. In a single moment I should not be processing more than 10 messages. To test this, I configured my DefaultJmsListenerContainerFactory 5-5 like below:

@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;
}

And the listeners as below:

@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();
}

Is each listener assigned 5 consumers or are the 5 consumers shared between the two listeners? If the former is true, is there any way to configure such that the 5 consumers are shared?

I sent 10 requests to both queues using two for loops:

    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));
    }

This is what the logs printed:

 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

I can't tell whether the consumers are being shared. Is there a better testing strategy?

You will get two complete listener containers with that configuration; each with 5 consumers.

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM