【发布时间】:2017-08-19 22:54:04
【问题描述】:
我正在尝试构建一个 spring-boot 应用程序,它将从 activeMQ 生产者读取数据。我希望客户可用的资源达到最佳状态。在我的 spring-boot 应用程序中,我想配置多个消费者,所有这些消费者都将连接到一个队列。
他们是我可以在 sprint-boot 应用程序上动态扩展和缩减消费者的一种方式吗?
【问题讨论】:
标签: spring-boot java-8 activemq
我正在尝试构建一个 spring-boot 应用程序,它将从 activeMQ 生产者读取数据。我希望客户可用的资源达到最佳状态。在我的 spring-boot 应用程序中,我想配置多个消费者,所有这些消费者都将连接到一个队列。
他们是我可以在 sprint-boot 应用程序上动态扩展和缩减消费者的一种方式吗?
【问题讨论】:
标签: spring-boot java-8 activemq
您所说的消费者是DefaultMessageListenerContainer 的不同线程还是DefaultMessageListenerContainer 的不同实例?
您可以通过更改来动态增加和减少 DefaultMessageListenerContainer 的线程数
org.springframework.jms.listener.DefaultMessageListenerContainer.concurrentConsumers
和
org.springframework.jms.listener.DefaultMessageListenerContainer.maxConcurrentConsumers
相应地
更新
如果您使用多个消费者和/或线程,则需要调整 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 添加到 activemq.xml 中的 uri 配置中,或者像这样在客户端 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
还有
【讨论】: