【问题标题】:Springboot JMS LIstener ActiveMQ is very slowSpringboot JMS Listener ActiveMQ 很慢
【发布时间】:2017-04-19 00:08:45
【问题描述】:

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

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

上面是我的通道消费者类的sn-p,它有一个处理器实例(注入,自动装配,里面我有@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 中注意到使用的堆不断增加


我想知道:
1. 我的步骤有什么错误/遗漏吗?我的消息率什至无法触及数百个
2.注解的@JmsListener方法会执行异步还是同步?
3. 如果可能并支持,如何正确优雅地使用传统的同步接收()和SpringBoot?

谢谢

【问题讨论】:

    标签: spring spring-boot jms activemq spring-jms


    【解决方案1】:

    我只是在检查类似的东西。我在我的 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.

    【讨论】:

      猜你喜欢
      • 2018-10-10
      • 1970-01-01
      • 2015-12-01
      • 2011-01-20
      • 1970-01-01
      • 2022-12-03
      • 1970-01-01
      • 2014-03-31
      • 2017-01-25
      相关资源
      最近更新 更多