当MessageListener第一次抛出异常时,RabbitMQ侦听器会停止侦听消息

时间:2018-03-30 18:05:44

标签: rabbitmq spring-amqp

我遇到一个不寻常的问题,在处理第一条消息期间抛出异常后,Spring Amqp MessageListener停止接收任何进一步的消息。在我的代码中,我没有明确地进行任何资源锁定。任何人都可以建议问题是什么。任何帮助将不胜感激,因为我没有想法。

MQ配置:

<rabbit:admin id="rabbitAdmin" connection-factory="rabbitConnectionFactory" />

     <rabbit:connection-factory
            id="rabbitConnectionFactory" 
            host="${rabbitmq.host}" 
            port="${rabbitmq.port}" 
            username="${rabbitmq.username}" 
            password="${rabbitmq.password}"/>

    <!--
      Configure the rabbitTemplate helper class to simplify rabbitMQ
      access (sending and receiving message).
      The default Exchange is used here.
    -->
    <rabbit:template id="rabbitTemplate" connection-factory="rabbitConnectionFactory" message-converter="rabbitSimpleMessageConverter" retry-template="rabbitRetryTemplate" />
<bean id="rabbitRetryTemplate" class="org.springframework.retry.support.RetryTemplate">
        <property name="backOffPolicy">
            <bean class="org.springframework.retry.backoff.ExponentialBackOffPolicy">
                <property name="initialInterval" value="500" />
                <property name="multiplier" value="5" />
                <property name="maxInterval" value="90000" />
            </bean>
        </property>
        <property name="retryPolicy">
            <bean class="org.springframework.retry.policy.SimpleRetryPolicy">
                <property name="maxAttempts" value="5"/>
            </bean>
        </property>
    </bean>

    <bean id="rabbitRetryInterceptor" class="org.springframework.amqp.rabbit.config.StatefulRetryOperationsInterceptorFactoryBean">
        <property name="messageRecoverer" ref="rejectAndDontRequeueRecoverer"/>
        <property name="retryOperations" ref="rabbitRetryTemplate" />
    </bean>

    <!-- Consumers -->
    <bean id="genericMessageConsumer" class="org.bla.GenericMessageConsumer" />
    <rabbit:listener-container
        connection-factory="rabbitConnectionFactory"
        advice-chain="rabbitRetryInterceptor"
        concurrency="${rabbitmq.concurrency}"
        max-concurrency="${rabbitmq.maxconcurrency}"
        acknowledge="auto" >
        <rabbit:listener ref="genericMessageConsumer" queue-names="${rabbitmq.orion.genericNotificationdata.queueName}" />
    </rabbit:listener-container>

MessageListener类

public class GenericMessageConsumer implements MessageListener{
....
    @Override
public void onMessage(Message message) {
try{
...Some logic...

} catch (Exception e) {
  throw new RuntimeException(e.getMessage(), e);
}

在处理第一条消息时抛出异常后,容器仍然处于运行状态,但在重新启动容器之前不会处理剩余的消息。第一封邮件也处于未确认状态。

尝试检查与我的问题相同的其他帖子: 1)RabbitMQ listener stops listening messages when MessageListener throws exception 但我无法找到解决方案。

0 个答案:

没有答案