2017-03-27 42 views
0

我正尝试构建一个从activeMQ生产者读取数据的spring-boot应用程序。我希望客户的资源能够最佳化。在我的spring-boot应用程序中,我想配置多个使用者,并且所有这些使用者都将连接到一个队列。JMS消费者在春季启动时的动态缩放

是他们的一种方式,我可以在sprint-boot应用程序中动态扩展和缩减消费者吗?

回答

1

您所说的消费者,是不同线程的DefaultMessageListenerContainerDefaultMessageListenerContainer的不同实例?

可以增加和动态减少通过改变

org.springframework.jms.listener.DefaultMessageListenerContainer.concurrentConsumers 

org.springframework.jms.listener.DefaultMessageListenerContainer.maxConcurrentConsumers 线程使用DefaultMessageListenerContainer的数量相应

UPDATE

,如果你有多个消费者的工作和/或者是您需要修改prefetchPolicy。

persistent queues (default value: 1000) 
non-persistent queues (default value: 1000) 
persistent topics (default value: 100) 
non-persistent topics (default value: Short.MAX_VALUE - 1) 

所有消息被派往第一所连接的消费者,当另外一个连接,他没有收到邮件,因此,如果你有需要prefetchPolicy设定的较低值的队列同时消费者改变这种行为比默认值。例如,这jms.prefetchPolicy.queuePrefetch=1添加到URI配置在activemq.xml中或将其设置在客户端的URL等推荐用于高 消息量高性能的这个

ActiveMQConnectionFactory connectionFactory = new ActiveMQConnectionFactory("tcp://172.16.143.99:61616?jms.prefetchPolicy.queuePrefetch=1"); 

预取大值。但是,对于消息量较小的消息,每个消息需要很长时间才能处理,预取应设置为1. 这确保消费者一次只处理一条消息。 但是,指定预取限制为零将导致消费者 轮询一次一个消息,而不是将消息推送给使用者,该消息是 。

看看http://activemq.apache.org/what-is-the-prefetch-limit-for.html

而且

http://activemq.apache.org/destination-options.html

+0

我有同样的应用程序的多个实例,我打算创建多个消费者在每个instance.Is它一个最佳的解决方案? –

+0

DMLC的同一个实例中的多个线程正常,但为什么DMLC(消费者)和应用程序的多个实例要从单个队列中消耗? –

+0

维护这些实例的故障安全。如果配置了DMLC的实例发生故障,则消息处理将停止。 –