SimpleMessageListenerContainer handleMesage() 是如何工作的?
How does SimpleMessageListenerContainer handleMesage() works?
我对 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>
在 1.3 及更高版本中,每个消费者一次获得预取消息(代理向它们发送循环)
是的,但他们被称为消费者,而不是接收者
当侦听器方法退出时,消费者获取下一条消息,这释放了 amqp-client 线程,以便它可以从代理获取另一条消息。
使用 ackmode NONE,这取决于您使用的 Spring AMQP 版本如何将消息传递给消费者。
对于 1.3 之前的版本,所有 1000 条消息都会立即发送到容器(每个消费者 200 条)。
1.3.0版本后,发送给每个消费者的消息数量取决于prefetchCount
属性(默认1);实际上,每个消费者都会从代理中删除 prefetch+1
条消息。
了解 AcknowledgeMode="NONE"
意味着您可能会丢失消息,因为代理会在消息发送给消费者时自动确认消息。如果服务器崩溃,任何位于消费者(预取)中的消息都将丢失。
我对 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>
在 1.3 及更高版本中,每个消费者一次获得预取消息(代理向它们发送循环)
是的,但他们被称为消费者,而不是接收者
当侦听器方法退出时,消费者获取下一条消息,这释放了 amqp-client 线程,以便它可以从代理获取另一条消息。
使用 ackmode NONE,这取决于您使用的 Spring AMQP 版本如何将消息传递给消费者。
对于 1.3 之前的版本,所有 1000 条消息都会立即发送到容器(每个消费者 200 条)。
1.3.0版本后,发送给每个消费者的消息数量取决于prefetchCount
属性(默认1);实际上,每个消费者都会从代理中删除 prefetch+1
条消息。
了解 AcknowledgeMode="NONE"
意味着您可能会丢失消息,因为代理会在消息发送给消费者时自动确认消息。如果服务器崩溃,任何位于消费者(预取)中的消息都将丢失。