Springboot JMS侦听器ActiveMQ非常慢

Springboot JMS侦听器ActiveMQ非常慢,spring,spring-boot,jms,activemq,spring-jms,Spring,Spring Boot,Jms,Activemq,Spring Jms,我有一个SpringBoot应用程序,它使用来自ActiveMQ队列的自定义可序列化消息。到目前为止,它是有效的,但是,消费率是非常差的,只有1-20味精/秒 @JmsListener(destination = "${channel.consumer.destination}", concurrency="${channel.consumer.maxConcurrency}") public void receive(IMessage message) { processor.proc

我有一个SpringBoot应用程序,它使用来自ActiveMQ队列的自定义可序列化消息。到目前为止,它是有效的,但是,消费率是非常差的,只有1-20味精/秒

@JmsListener(destination = "${channel.consumer.destination}", concurrency="${channel.consumer.maxConcurrency}")
public void receive(IMessage message) {
    processor.process(message);
}
上面是我的channel consumer类的代码片段,它有一个处理器实例(注入、自动连接,其中我有@Async service,因此我可以假设主线程将在消息输入@Async method后立即释放),并且它使用我从应用程序属性设置的springboot activemq默认连接工厂

# 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监视器中使用的堆一直在增加


我想知道:
1.我的步骤有什么错误/遗漏吗?我的消息速率甚至达不到数百次
2.带注释的@JmsListener方法将执行进程异步或同步?
3.如果可能且受支持,如何将传统的sync receive()与SpringBoot一起正确、优雅地使用?


谢谢

我只是想看看类似的东西。我在JMSCOConfiguration类(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;
}
如你所见,我从中获取了这些值。这是从2010年开始的,但到目前为止我还没有找到任何更新/更好的

我还将Spring的CachingConnectionFactorybean定义为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的情况下,“in memory”属性将被忽略

让我知道这是否有用

G