SimpleMessageListenerContainer handleMesage()如何工作?

时间:2015-07-03 14:49:22

标签: spring-amqp

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

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

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

  3. 想知道控件将在哪里处理消息的结束?

  4. 你能告诉我这些吗...因为我们无法在消费者在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 个答案:

答案 0 :(得分:1)

  1. 对于版本1.3及更高版本,每个消费者一次获取预取消息(代理将其循环发送)

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

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

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

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

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

    了解AcknowledgeMode="NONE"表示您可以丢失消息,因为代理会在将消息发送给消费者时自动获取消息。如果服务器崩溃,那么消费者中的任何消息(预取)都将丢失。