当前位置: 首页 > 知识库问答 >
问题:

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

夏长卿
2023-03-14

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

我的听众:

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

共有1个答案

梅飞龙
2023-03-14

您所拥有的应该可以工作-打开org的调试日志记录。springframework。jms,您将看到关于消费者管理的消息-确保在日志配置中包括线程,您将看到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
 类似资料:
  • 问题内容: 我必须在testng中编写以下单元测试用例: saveProductTest如果产品详细信息成功保存在数据库中,则将返回productId。 ModifyProductTest,它应该使用以前保存的productId作为参数。 我正在使用testNg数据提供程序从XML文件中获取saveProductTest的产品详细信息输入(PrdouctName,ReleaseDate)和Modi

  • 为什么能起作用?请给我解释一下为什么和怎么做!

  • 简介 这部分我们将回到"回调"这个主题.我们将介绍另外一种写回调函数的方法,即在Twisted中使用 generators. 我们将演示如何使用这种方法并且与使用"纯" Deferreds 进行对比. 最后, 我们将使用这种技术重写诗歌客户端. 但首先我们来回顾一下 generators 的工作原理,以便弄清楚它为何是创建回调的候选方法. 简要回顾生成器 你可能知道, 一个Python生成器是一个

  • 我试图实现一个服务器发送的事件控制器,用最新的数据更新我的Web浏览器客户端。 这是我当前的控制器,每5秒发送一次我的数据列表。我想在每次将数据保存在其他服务中时发送 SSE。我阅读了有关使用通道的信息,但是如何将其与 Flux 一起使用?

  • 问题内容: 用户可以通过文本框中的邮政编码(例如:L14,L15,L16)或位置进行搜索。 如果用户键入“ Liverpool”,它将找到位于“ Liverpool”的所有商店。如果用户输入邮政编码(例如:L15),它将搜索所有在L15邮政编码区域中交货的商店。 请参阅下表: -- SQL查询: -- 结果-按位置(利物浦): 结果-按邮政编码(L12): 它似乎工作正常…是否还有其他方法可以缩短

  • -在if语句中输入图像描述错误