ActiveMQ从客户端连接之前发送的队列接收消息

时间:2017-01-13 10:44:31

标签: jms activemq

在我的场景中,生产者正在将消息发送到队列(像往常一样:),但其中一个消费者不时关闭,因此我必须能够在消费者关闭时读取发送到该队列的所有消息。换句话说,我正在寻找消息或整个服务器的配置,它允许在重新连接消费者之后接收消息,而消息是事先发送的。

更准确地说,当客户端重新连接时,它无法接收队列中待处理的消息。我需要的是强制新连接的客户端接收队列中已经挂起的消息,以帮助其他客户端释放队列。

1 个答案:

答案 0 :(得分:2)

这是定义的正常行为,发送到队列的消息仍未决,如果没有连接消费者,则不会丢失。

<强>更新

所以我认为你的问题是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添加到a​​ctivemq.xml中的uri配置中,或者将其设置在客户端URL上。

  

建议使用较大的预取值以获得较高的高性能   消息卷。但是,对于较低的消息量,每个消息量   消息需要很长时间才能处理,预取应该设置为1。   这可确保消费者一次只处理一条消息。   但是,将预取限制指定为零将导致使用者   一次一个地轮询消息,而不是消息   推向消费者。

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

并且

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