gpt4 book ai didi

Springboot JMS Listener ActiveMQ很慢

转载 作者:行者123 更新时间:2023-12-02 11:58:03 26 4
gpt4 key购买 nike

我有一个 SpringBoot 应用程序,它使用来自 ActiveMQ 队列的自定义可序列化消息。目前为止是可以运行的,但是消耗速度很差,只有1 - 20 msg/sec。

@JmsListener(destination = "${channel.consumer.destination}", concurrency="${channel.consumer.maxConcurrency}")
public void receive(IMessage message) {
processor.process(message);
}

上面是我的 channel 消费者类的片段,它有一个处理器实例(注入(inject)、 Autowiring ,并且在其中我有 @Async 服务,所以我可以假设一旦消息进入 @Async 方法,主线程就会被释放)并且它还使用我从应用程序属性中设置的 springboot activemq 默认 conn 工厂

# ACTIVEMQ (ActiveMQProperties)
spring.activemq.broker-url= tcp://localhost:61616?keepAlive=true
spring.activemq.in-memory=true
spring.activemq.pool.enabled=true
spring.activemq.pool.expiry-timeout=1
spring.activemq.pool.idle-timeout=30000
spring.activemq.pool.max-connections=50

有几件事值得通知:
1.我在本地笔记本电脑上运行所有内容(Eclipse、ActiveMQ、MYSQL)
2.在此之前,我还尝试使用配备自定义线程池任务执行器的自定义连接工厂(默认AMQ、池化和缓存),但仍然得到相同的结果。下面是我拍摄的性能快照,每 1 秒更新一次
3.我还注意到JVM Monitor中已用堆不断增加

My JVM Monitor Instance

Performance Counter Snapshot


我想知道:
1.我的步骤是不是有什么问题/遗漏?我的消息率连几百都碰不到
2.注解@JmsListener方法将执行异步还是同步流程?
3. 如果可能并且支持,如何正确且优雅地使用传统的sync receive()与SpringBoot?

谢谢

最佳答案

我只是在检查类似的东西。我在 JMSConfiguration 类(Spring 配置)中定义了 DefaultJmsListenerContainerFactory,如下所示:

@Bean
public DefaultJmsListenerContainerFactory jmsListenerContainerFactory(CachingConnectionFactory connectionFactory) {

// settings made based on https://bsnyderblog.blogspot.sk/2010/05/tuning-jms-message-consumption-in.html
DefaultJmsListenerContainerFactory factory = new DefaultJmsListenerContainerFactory(){
@Override
protected void initializeContainer(DefaultMessageListenerContainer container) {
super.initializeContainer(container);
container.setIdleConsumerLimit(5);
container.setIdleTaskExecutionLimit(10);
}
};
factory.setConnectionFactory(connectionFactory);
factory.setConcurrency("10-50");
factory.setCacheLevel(CACHE_CONSUMER);
factory.setReceiveTimeout(5000L);
factory.setDestinationResolver(new BeanFactoryDestinationResolver(beanFactory));
return factory;
}

如您所见,我从 https://bsnyderblog.blogspot.sk/2010/05/tuning-jms-message-consumption-in.html 中获取了这些值。 。这是 2010 年的版本,但到目前为止我找不到任何更新/更好的内容。

我还将 Spring 的 CachingConnectionFactory Bean 定义为 ConnectionFactory:

@Bean
public CachingConnectionFactory buildCachingConnectionFactory(@Value("${activemq.url}") String brokerUrl) {
// settings based on https://bsnyderblog.blogspot.sk/2010/02/using-spring-jmstemplate-to-send-jms.html
ActiveMQConnectionFactory activeMQConnectionFactory = new ActiveMQConnectionFactory();
activeMQConnectionFactory.setBrokerURL(brokerUrl);
CachingConnectionFactory cachingConnectionFactory = new CachingConnectionFactory(activeMQConnectionFactory);
cachingConnectionFactory.setSessionCacheSize(10);
return cachingConnectionFactory;
}

此设置将帮助 JmsTemplate 进行发送。

所以我给你的答案是设置连接池的值,如链接中所述。另外我想您可以删除 spring.activemq.in-memory=true 因为(基于文档)如果您指定自定义代理 URL,“内存中”属性将被忽略。

请告诉我这是否有帮助。

G.

关于Springboot JMS Listener ActiveMQ很慢,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40960023/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com