即使我有一个非独占队列,我注意到消息是根据连接时间以循环方式传递给消费者的。我正在使用JCSMP并将EndpointProperties设置为ACCESSTYPE_NONEXCLUSIVE。
以下是我测试的方式:
(1)在开始任何消息消费者之前,我将第一批20条消息发送到队列。
(2)我启动消费者1,处理每条消息延迟2秒的消息。
(3)接下来,我开始使用Consumer 2,而Consumer 1正在使用第一批消息。即使消费者2正在运行,但由于来自第一批的消息未传递给它,所以它处于空闲状态。
(4)我发送第二批20条消息。来自第二批的这些消息以循环方式传递给消费者1和消费者2.
(5)虽然消费者1正在处理来自第一批和第二批的消息,而消费者2正在处理来自第二批的消息,但我启动消费者3.虽然消费者3正在运行,但它是空闲的,因为没有来自第一批和第二批交付给它。
(6)我发送第3批20条消息。来自第3批的这些消息以循环方式传递给消费者1,消费者2和消费者3.
我期待无论消息何时存储在队列中,当我启动任何消费者时,都应该将消息传递给他们。这很重要,这样如果消息堆积在队列中,我可以启动更多的消费者来清除积压。但是,根据我的实验,它似乎不起作用。我错过了某处的设置吗?
感谢您的建议。谢谢。
答案 0 :(得分:2)
在您的问题的第2步,队列将在收到确认之前向Consumer 1发送一批消息。 "保证消息窗口大小"消费者的流属性确定将传递多少消息,默认"保证消息窗口大小"是255条消息。队列属性称为" Max Delivered Unacked Messages Per Flow"还将确定在没有收到确认的情况下,一次可以从队列发送到一个消费者的消息数量,此属性的默认值为10,000。
在步骤3,消息已经发送到消费者1,队列正在等待这些消息的确认,因此消费者2将不会收到这些消息。
默认情况下,队列将批量发送消息给消费者,以便为将快速确认消息的应用程序提供高吞吐量。如果应用程序在确认之前需要2秒钟来处理消息,那么编辑上面提到的两个属性以允许一次将一条消息传递给消费者将是有益的。
您可以设置"保证消息窗口大小"消费者流量的属性和每个流量的最大交付未消息消息"队列中的属性为1.这将允许队列在收到确认之前仅传递一条消息,因此当新的消费者绑定到非独占队列时,它将接收下一条消息。