2

尽管我有一个非独占队列,但我注意到消息会根据连接时间以循环方式传递给消费者。我正在使用 JCSMP 并将 EndpointProperties 设置为 ACCESSTYPE_NONEXCLUSIVE。

这是我的测试方法:

(1) 在启动任何消息消费者之前,我将第一批 20 条消息发送到队列。

(2) 我启动 Consumer 1 处理消息,每条消息延迟 2 秒。

(3) 接下来,当消费者 1 正在消费第一批消息时,我启动消费者 2。尽管消费者 2 正在运行,但它处于空闲状态,因为来自第一批的消息没有传递给它。

(4) 我发送了第二批 20 条消息。来自第二批的这些消息以循环方式传递给消费者 1 和消费者 2。

(5) 当消费者 1 正在处理来自第一批和第二批的消息,而消费者 2 正在处理来自第二批的消息时,我启动消费者 3。虽然消费者 3 正在运行,但它处于空闲状态,因为没有来自第一批和第二批的消息传递给它。

(6) 我发送了第三批 20 条消息。来自第三批的这些消息以循环方式传递给消费者 1、消费者 2 和消费者 3。

我期望无论消息何时存储在队列中,当我启动任何消费者时,都应该将消息传递给他们。这很重要,这样如果消息堆积在队列中,我可以启动更多消费者来清除积压。但是,根据我的实验,它似乎不起作用。我是否错过了某处的任何设置?

感谢您的建议。谢谢你。

4

1 回答 1

2

在您问题的第 2 步,队列将在收到确认之前向消费者 1 发送一批消息。消费者的“保证消息窗口大小”流属性决定了将传递多少条消息,默认的“保证消息窗口大小”为 255 条消息。名为“Max Delivered Unacked Messages Per Flow”的队列属性还将确定一次可以从队列向一个消费者发送多少条消息而没有收到确认,该属性的默认值为 10,000。

在第 3 步,消息已经发送到消费者 1,队列正在等待对这些消息的确认,因此消费者 2 将不会收到这些消息。

默认情况下,队列会分批向消费者发送消息,为快速确认消息的应用程序提供高吞吐量。如果应用程序在确认消息之前需要 2 秒来处理消息,那么编辑上面提到的两个属性以允许一次将一条消息传递给消费者将是有益的。

您可以将消费者流上的“Guaranteed Message Window Size”属性和队列上的“Max Delivered Unacked Messages Per Flow”属性设置为 1。这将允许队列在收到确认之前仅传递一条消息,所以当一个新的消费者绑定到非独占队列时,它会收到下一条消息。

于 2016-03-24T15:52:10.227 回答