SimpleMessageListenerContainer handleMesage() 是如何工作的?

How does SimpleMessageListenerContainer handleMesage() works?

我对 SimpleMessageListenerContainer handleMesage 的工作原理有疑问?我的问题场景是,我在队列中有 1000 条消息(m1,m2 ... m100)然后启动消费者(5 个并发消费者)和 acknowledgeMode='NONE' 在这种情况下,

  1. handleMesage 是否一次消耗 5 条消息 (m1,m2,m3,m4,m5) 然后接下来的 5 条消息,依此类推... ?

  2. 容器是否创建了 5 个 Receiver 实例?

  3. 想知道句柄消息的结尾,控制将转到哪里?

你能告诉我这些吗..因为一旦消费者在 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. 在 1.3 及更高版本中,每个消费者一次获得预取消息(代理向它们发送循环)

  2. 是的,但他们被称为消费者,而不是接收者

  3. 当侦听器方法退出时,消费者获取下一条消息,这释放了 amqp-client 线程,以便它可以从代理获取另一条消息。

使用 ackmode NONE,这取决于您使用的 Spring AMQP 版本如何将消息传递给消费者。

对于 1.3 之前的版本,所有 1000 条消息都会立即发送到容器(每个消费者 200 条)。

1.3.0版本后,发送给每个消费者的消息数量取决于prefetchCount 属性(默认1);实际上,每个消费者都会从代理中删除 prefetch+1 条消息。

了解 AcknowledgeMode="NONE" 意味着您可能会丢失消息,因为代理会在消息发送给消费者时自动确认消息。如果服务器崩溃,任何位于消费者(预取)中的消息都将丢失。