java - Spring JMS @JmsListener 一种方法的另一种并发性

标签 java jboss6.x spring-jms

如何通过 @JmsListener 仅更改一种方法的默认并发? 我已将并发添加到 @JmsListener(如下所示),但“JBoss 管理控制台运行时 JMS 队列指标”中没有任何变化。 我有 JBoss 6.4,Spring JMS 版本 4.3.1.RELEASE。

我的听众:

@JmsListener(containerFactory = "myJmsQueueListenerContainerFactory", destination = "some.destination", concurrency = "3-10")
@SendTo("some.place")
public TransactionBookingStatus bookTransaction(Message message) throws JMSException {
    //my implementation
}

我的默认配置:

@Bean
public JndiObjectFactoryBean jmsConnectionFactoryFactoryBean() {
    JndiObjectFactoryBean factory = new JndiObjectFactoryBean();
    factory.setJndiName("java:/ConnectionFactory");

    return factory;
}

public ConnectionFactory jmsConnectionFactory() {
    return (ConnectionFactory) jmsConnectionFactoryFactoryBean().getObject();
}

@Bean
public JmsTemplate testMessageTemplate() {
    JmsTemplate tmpl = new JmsTemplate();

    tmpl.setConnectionFactory(jmsConnectionFactory());

    return tmpl;
}

@Bean
public DefaultJmsListenerContainerFactory myJmsQueueListenerContainerFactory() {
    DefaultJmsListenerContainerFactory factory = new DefaultJmsListenerContainerFactory();
    factory.setConnectionFactory(jmsConnectionFactory());
    factory.setConcurrency("3-40");

    factory.setErrorHandler(new TrnJmsErrorHandler());

    return factory;
}

最佳答案

你所拥有的应该工作 - 打开 org.springframework.jms 的 DEBUG 日志记录,你会看到关于消费者管理的消息 - 确保在日志配置中包含线程,你应该会看到3 个消费者线程。

编辑

@SpringBootApplication
public class So40908517Application {

    public static void main(String[] args) throws Exception {
        ConfigurableApplicationContext context = SpringApplication.run(So40908517Application.class, args);
        JmsTemplate template = context.getBean(JmsTemplate.class);
        for (int i = 0; i < 3; i++) {
            template.convertAndSend("foo", "bar");
        }
        context.getBean(CountDownLatch.class).await();
        context.close();
    }

    @Bean
    public CountDownLatch latch() {
        return new CountDownLatch(3);
    }

    @JmsListener(destination = "foo", concurrency = "3-40")
    public void listen(String in) {
        System.out.println(in + " received on " + Thread.currentThread().getName());
        latch().countDown();
    }

}

结果(预期为 3 个线程):

  .   ____          _            __ _ _
 /\\ / ___'_ __ _ _(_)_ __  __ _ \ \ \ \
( ( )\___ | '_ | '_| | '_ \/ _` | \ \ \ \
 \\/  ___)| |_)| | | | | || (_| |  ) ) ) )
  '  |____| .__|_| |_|_| |_\__, | / / / /
=========|_|==============|___/=/_/_/_/
:: Spring Boot ::        (v1.4.2.RELEASE)

bar received on DefaultMessageListenerContainer-3
bar received on DefaultMessageListenerContainer-2
bar received on DefaultMessageListenerContainer-1

关于java - Spring JMS @JmsListener 一种方法的另一种并发性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40908517/

相关文章:

java - Jackson 映射器到持久化对象

java - 在 JNDI 中查找 ${email.jndi.lookup.binding} 时出错

java - jbas015852 无法索引类 java.lang.IllegalStateException : Unknown tag

jboss - Java EE 7 兼容服务器?

java - 在同一配置类中配置 jms 接收和发送队列

spring - 使用 Hystrix 断路器暂停/恢复 JMS 监听器

java - 如何在 hibernate 中获取排序结果中的第一组结果?

java - 从 Eclipse 提交代码到 svn 时出现异常

java - 如何查找兄弟索引小于 x 且大于 y 的元素

java - 如何在 Spring JMS 监听器中从 JMS 消息获取自定义属性