我对SimpleMessageListenerContainer handleMesage如何工作有疑问?我的问题场景是,我在队列中有1000条消息(m1,m2 ... m100),然后在这种情况下启动了消费者(5个并发消费者)和acknowledgeMode ='NONE',
handleMesage一次消耗5条消息(m1,m2,m3,m4,m5)然后消息接下来5条消息,依此类推......?
容器是否会创建5个Receiver实例?
想知道控件将在哪里处理消息的结束?
你能告诉我这些吗...因为我们无法在消费者在RMQ MNGMT控制台中启动时看到消息....我们在handleMesage方法中的代码将至少花费几秒钟来处理每个请求。
<bean id="sampleListenerContainer"
class="org.springframework.amqp.rabbit.listener.SimpleMessageListenerContainer">
<property name="connectionFactory" ref="connectionFactory" />
<property name="queueNames">
<array>
<value>TEST_QUEUE</value>
</array>
</property>
<property name="messageListener" ref="messageListenerAdaptor" />
<property name="acknowledgeMode" value="NONE" />
<property name="concurrentConsumers" value="5" />
</bean>
<!-- message listener -->
<bean id="messageListenerAdaptor"
class="org.springframework.amqp.rabbit.listener.adapter.MessageListenerAdapter">
<property name="delegate" ref="listenerPojo" />
<property name="messageConverter" ref="messageConverter" />
</bean>
<bean id="listenerPojo"
class="com.amqp.consumer.Receiver" >
</bean>
答案 0 :(得分:1)
对于版本1.3及更高版本,每个消费者一次获取预取消息(代理将其循环发送)
是的,但他们被称为消费者,而不是接收者
当侦听器方法退出时,使用者会抓取下一条消息,这会释放amqp-client线程,以便它可以从代理获取另一条消息。
使用ackmode NONE,它取决于您使用的Spring AMQP版本如何将消息传递给消费者。
对于1.3之前的版本,所有1000条消息将立即发送到容器(每个消费者200条消息)。
在1.3.0版之后,发送给每个消费者的消息数取决于prefetchCount
属性(默认值为1);实际上,每个消费者都会从代理中删除prefetch+1
条消息。
了解AcknowledgeMode="NONE"
表示您可以丢失消息,因为代理会在将消息发送给消费者时自动获取消息。如果服务器崩溃,那么消费者中的任何消息(预取)都将丢失。