Как обрабатывается параллелизм, когда два слушателя jms имеют одну и ту же фабрику контейнеров слушателей в Spring

#java #spring-jms

#java #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 потребителей были общими?

Я отправил 10 запросов в обе очереди, используя два цикла for:

     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
  

Я не могу сказать, делятся ли потребители информацией. Есть ли лучшая стратегия тестирования?

Ответ №1:

Вы получите два полных контейнера прослушивателей с такой конфигурацией; каждый с 5 потребителями.