page contents

RabbitMQ重试机制没生效

Pack 发布于 2020-02-18 16:35
阅读 1197
收藏 0
分类:中间件

问题描述

希望在消费端消费出现异常时进行3次重试,当重试3次不成功后再将消息转发到死信队列


问题出现的环境背景及自己尝试过哪些方法

SpringMVC项目整合RabbitMQ

spring版本:3.2.11.RELEASE

spring-rabbit版本:1.4.6.RELEASE

在xml配置文件中增加了RetryTemplate相关配置,并在消费端的onMessage()方法中模拟抛出异常来验证重新效果。经实际测试,异常抛出了一次,消息转发到了死信队列,重新效果没在日志中看到


相关代码

xml配置文件


<?xml version="1.0" encoding="UTF-8"?>

<beans xmlns="http://www.springframework.org/schema/beans"

       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:rabbit="http://www.springframework.org/schema/rabbit"

       xsi:schemaLocation="http://www.springframework.org/schema/beans

     http://www.springframework.org/schema/beans/spring-beans-3.0.xsd

     http://www.springframework.org/schema/rabbit

     http://www.springframework.org/schema/rabbit/spring-rabbit-1.4.xsd">

     

<!--配置connection-factory,指定连接rabbit server参数 

    <rabbit:connection-factory id="connectionFactory" virtual-host="/ca-auth" username="${rabbitmq_username}" password="${rabbitmq_pwd}" host="${rabbitmq_host}" port="${rabbitmq_port}" />

    -->

    <!-- 172.31.20.2 -->

    <rabbit:connection-factory id="connectionFactory" virtual-host="/ca-auth" username="guest" password="guest" host="127.0.0.1" port="5672" publisher-confirms="true" publisher-returns="true"/>

    <!-- 通过指定下面的admin信息 -->

    <rabbit:admin id="connectAdmin" connection-factory="connectionFactory" />


    <!--定义queue -->

    <rabbit:queue name="ca_auth" durable="true" exclusive="false" declared-by="connectAdmin">

    <rabbit:queue-arguments>

  <entry key="x-message-ttl">

  <value type="java.lang.Long">30000</value>

  </entry>

<entry key="x-dead-letter-exchange">

<value>dlx.file_to_file</value>

</entry>

<entry key="x-dead-letter-routing-key">

<value>ca</value>

</entry>

  </rabbit:queue-arguments>

    </rabbit:queue>

    <rabbit:queue name="dlx.ca_auth" durable="true" exclusive="false" declared-by="connectAdmin">

    <rabbit:queue-arguments>

  <entry key="x-message-ttl">

  <value type="java.lang.Long">30000</value>

  </entry>

    </rabbit:queue-arguments>

    </rabbit:queue>


    <!--定义direct exchange -->

    <rabbit:direct-exchange name="file_to_file" durable="true" declared-by="connectAdmin">

        <rabbit:bindings>

            <rabbit:binding queue="ca_auth" key="ca"/>

        </rabbit:bindings>

    </rabbit:direct-exchange>

    

    <rabbit:direct-exchange name="dlx.file_to_file" durable="true" declared-by="connectAdmin">

        <rabbit:bindings>

            <rabbit:binding queue="dlx.ca_auth" key="ca"/>

        </rabbit:bindings>

    </rabbit:direct-exchange>

    

    <!--定义rabbit template -->

    <rabbit:template id="amqpTemplate" connection-factory="connectionFactory" exchange="file_to_file" confirm-callback="confirmCallBackListener" mandatory="true" return-callback="returnCallBackListener" retry-template="retryTemplate"/>

<!--  retry-template="retryTemplate"  -->

    <!--定义receiver -->

    <bean id="messageReceiver" class="com.cnpany.common.fadada.service.impl.AsynHandler"></bean>

    <!--定义listener -->

    <rabbit:listener-container connection-factory="connectionFactory" requeue-rejected="false">

        <rabbit:listener queues="ca_auth" ref="messageReceiver" />

    </rabbit:listener-container>

    

    <bean id="retryTemplate" class="org.springframework.retry.support.RetryTemplate">

      <property name="retryPolicy">

         <bean class="org.springframework.retry.policy.SimpleRetryPolicy">

            <property name="maxAttempts" value="3"/>

         </bean>

      </property>

   </bean>

</beans>

AsynHandler类的onMessage方法模拟异常代码


public void onMessage(Message message) {

this.logger.info("====MQ异步处理方法开始====");

String msg = new String(message.getBody());

int i = 0;

System.out.println(10/i);

}

日志输出截图

仅有一次异常记录,如果重新3次,是不是应该有3次


attachments-2020-02-g7gKp8YG5e4ba1a36ac54.png

RabbitMQ后台管理截图

在死信队列中看到了转来的死信

attachments-2020-02-lTwrRo3J5e4ba1ae0c85e.png


你期待的结果是什么?实际看到的错误信息又是什么?

请问为什么重新3次的效果没有看到,如果想要实现重新3次怎么实现

383
Pack
Pack

Spring Amqp中retry解决的是消费者与Broker之间的网络连接丢失,而自动重新连接的问题。
这里消息消费异常,但是连接正常,不会重试。

请先 登录 后评论