spring boot activemq使用者连接池

时间:2017-12-08 16:33:15

标签: spring spring-boot activemq connection-pooling consumer

需要配置Spring Boot ActiveMQ使用者连接池吗?我在Spring启动应用程序中只有一个消费者(作为微服务),生产者在另一个应用程序中。我对下面的内容感到困惑:(摘自http://activemq.apache.org/spring-support.html

注意:虽然PooledConnectionFactory允许创建一组活跃的消费者,但它并没有“汇集”。消费者。池化对于连接,会话和生产者来说是有意义的,它们可以是很少使用的资源,创建起来很昂贵并且可以以最小的成本保持闲置。另一方面,消费者通常只是在启动时创建并离开,处理来的消息。当消费者完成时,首选关闭它而不是让它空闲并将其返回到池中以供以后重用:这是因为,即使消费者处于空闲状态,ActiveMQ也会继续向消息传递消息。消费者的预取缓冲区,它们会被消除,直到消费者再次处于活动状态。

在同一页面上,我可以看到:
您可以使用activemq-pool org.apache.activemq.pool.PooledConnectionFactory为您的消费者集合高效汇集连接和会话,或者您可以使用Spring JMS org.springframework.jms.connection.CachingConnectionFactory来达到同样的效果

我尝试了CachingConnectionFactory(可以采用ActiveMQConnectionFactory),它只有很少的setter来保存cacheConsumers(boolean),cacheProducers(boolean),没有任何相关的池连接。我知道1个连接可以为您提供多个会话,然后每个会话您有多个消费者/生产者。但我的问题是消费者我们如何汇总,因为上述声明说它是默认的。所以我只用一种方法做到了这一点:左@Bean     public JmsListenerContainerFactory myFactory(ConnectionFactory connectionFactory,DefaultJmsListenerContainerFactoryConfigurer configurer){

    DefaultJmsListenerContainerFactory factory = new DefaultJmsListenerContainerFactory();
    // This provides all boot's default to this factory, including the message converter
    factory.setConcurrency("3-10");
    configurer.configure(factory, connectionFactory);
    // You could still override some of Boot's default if necessary.
    return factory;
}</em><br>

Dynamic scaling此链接也暗示了这一点,但我找不到具体的解决方案。

有人遇到过这种情况,请提出你的建议。感谢阅读这篇文章和任何帮助非常感谢。 生产的其他详细信息:

  • 此消费者每秒将收到约500条消息。
  • 使用Spring Boot版本1.5.8.RELEASE,
  • ActiveMQ 5.5是我的JMS

  • 1 个答案:

    答案 0 :(得分:0)

    activemq中有一个名为org.apache.activemq.jms.pool的包,它提供了PooledConsumer。下面是代码。请检查并查看它是否适合您。我知道它不是弹簧方式,但您可以轻松地设置自定义轮询方法。

    PooledConnectionFactory pooledConFactory = null;
        PooledConnection pooledConnection = null;
        PooledSession pooledSession = null;
        PooledMessageConsumer pooledConsumer = null;
        Message message = null;
        try
        {
            // Get the connection object from PooledConnectionFactory
            pooledConFactory = ( PooledConnectionFactory ) this.jmsTemplateMap.getConnectionFactory();
            pooledConnection = ( PooledConnection ) pooledConFactory.createConnection();
            pooledConnection.start();
    
            // Create the PooledSession from pooledConnection object
            pooledSession = ( PooledSession ) pooledConnection.createSession( false, 1 );
    
            // Create the PooledMessageConsumer from session with given ack mode and destination
            pooledConsumer = ( PooledMessageConsumer ) pooledSession.
                    createConsumer( this.jmsTemplateMap.getDefaultDestination(), <messageFilter if any>);
    
            while ( true )
            {
                message = pooledConsumer.receiveNoWait();
                if ( message != null) 
                    break;
            }
    
        }
        catch ( JMSException ex )
        {
            LOGGER.error("JMS Exception occured, closing the session", ex );
        }
        return message;