【问题标题】:How is concurrency handled where two jms listeners have the same Listener Container Factory in SpringSpring中两个jms侦听器具有相同侦听器容器工厂的并发如何处理
【发布时间】:2020-09-11 21:39:16
【问题描述】:

我应该监听两个队列并以并发方式处理消息。在一个单一的时刻,我不应该处理超过 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

我无法判断消费者是否被共享。有更好的测试策略吗?

【问题讨论】:

    标签: java spring-jms


    【解决方案1】:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-05-27
      • 2018-03-07
      • 2013-02-17
      • 2015-05-19
      相关资源
      最近更新 更多