在我的场景中,生产者正在将消息发送到队列(像往常一样:),但其中一个消费者不时关闭,因此我必须能够在消费者关闭时读取发送到该队列的所有消息。换句话说,我正在寻找消息或整个服务器的配置,它允许在重新连接消费者之后接收消息,而消息是事先发送的。
更准确地说,当客户端重新连接时,它无法接收队列中待处理的消息。我需要的是强制新连接的客户端接收队列中已经挂起的消息,以帮助其他客户端释放队列。
答案 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
添加到activemq.xml中的uri配置中,或者将其设置在客户端URL上。
建议使用较大的预取值以获得较高的高性能 消息卷。但是,对于较低的消息量,每个消息量 消息需要很长时间才能处理,预取应该设置为1。 这可确保消费者一次只处理一条消息。 但是,将预取限制指定为零将导致使用者 一次一个地轮询消息,而不是消息 推向消费者。
查看http://activemq.apache.org/what-is-the-prefetch-limit-for.html
并且