代码之家  ›  专栏  ›  技术社区  ›  user1295235

当MessageListener第一次引发异常时,RabbitMQ侦听器停止侦听消息

  •  0
  • user1295235  · 技术社区  · 8 年前

    我面临一个不寻常的问题,在处理第一条消息期间引发异常后,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 回复  |  直到 8 年前
    推荐文章