【RabbitMQ】08 深入部分P1 可靠性投递

1、消息投递确认

 这里的代码延用了06的东西:

https://www.cnblogs.com/mindzone/p/15374684.html

删除之前的整合案例,重新写了一份案例的队列和交换机配置

<?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:context="http://www.springframework.org/schema/context"
       xmlns:rabbit="http://www.springframework.org/schema/rabbit"
       xsi:schemaLocation="http://www.springframework.org/schema/beans
       http://www.springframework.org/schema/beans/spring-beans.xsd
       http://www.springframework.org/schema/context
       https://www.springframework.org/schema/context/spring-context.xsd
       http://www.springframework.org/schema/rabbit
       http://www.springframework.org/schema/rabbit/spring-rabbit.xsd">
    <!--加载配置文件-->
    <context:property-placeholder location="classpath:rabbitmq.properties"/>

    <!-- 定义rabbitmq connectionFactory

        publisher-confirms="true" 消息发送可确认
        publisher-returns="true"
    -->
    <rabbit:connection-factory id="connectionFactory" host="${rabbitmq.host}"
                               port="${rabbitmq.port}"
                               username="${rabbitmq.username}"
                               password="${rabbitmq.password}"
                               virtual-host="${rabbitmq.virtual-host}"
                               publisher-confirms="true"
                               publisher-returns="true"
    />
    <!--定义管理交换机、队列-->
    <rabbit:admin connection-factory="connectionFactory"/>

    <!--定义rabbitTemplate对象操作可以在代码中方便发送消息-->
    <rabbit:template id="rabbitTemplate" connection-factory="connectionFactory"/>
    
    <!-- 消息可靠性投递 -->
    <rabbit:queue id="confirm-test-queue" name="confirm-test-queue" />
    <rabbit:direct-exchange name="confirm-test-exchange" >
        <rabbit:bindings>
            <rabbit:binding queue="confirm-test-queue" key="confirm" />
        </rabbit:bindings>
    </rabbit:direct-exchange>
    

</beans>

测试类:

package cn.dzz;

import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.amqp.rabbit.connection.CorrelationData;
import org.springframework.amqp.rabbit.core.RabbitTemplate;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.test.context.ContextConfiguration;
import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;

@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(locations = "classpath*:producer-config.xml")
public class SpringProducerTest {

    @Autowired
    private RabbitTemplate rabbitTemplate;

    /**
     * 消息送出可靠性测试
     * 1、xml配置数据连接工厂开启消息可确认设置 √
     * 2、rabbitTemplate对象定义回调函数
     */
    @Test
    public void sendingReliableTest() {

        /**
         *  CorrelationData correlationData相关配置信息
         *  boolean ack 来自交换机收到消息的确认参数 true收到了 false没收到
         *  String cause 失败的原因信息 发送成功了就没有失败原因 case为null
         */
        rabbitTemplate.setConfirmCallback((correlationData, ack, cause) -> {
            System.out.println("确认消息真的从生产者服务发送到了RabbitMQ中间件这里, 然后这个周期的时刻需要做的什么事情 。。。。");
            if (ack) {
                System.out.println("rabbitMQ收到消息了 " + cause);
            } else {
                System.out.println("rabbitMQ没收到消息 : cause by " + cause);
                // 如果没收到就需要做对应的处理逻辑
            }
        });
        rabbitTemplate.convertAndSend("confirm-test-exchange", "confirm", " 发送一条消息以测试confirm回调。。。。");
    }
}

可靠投递确认就是设置两样东西

1、连接工厂开启确认项配置

2、模板对象重写确认回调函数

正常编写配置,执行结果肯定是消息发送正常

输出信息:

"C:Program Files (x86)Javajdk1.8.0_291injava.exe" -ea -Didea.test.cyclic.buffer.size=1048576 "-javaagent:C:Program FilesJetBrainsIntelliJ IDEA 2021.2.1libidea_rt.jar=51932:C:Program FilesJetBrainsIntelliJ IDEA 2021.2.1in" -Dfile.encoding=UTF-8 -classpath "C:Program FilesJetBrainsIntelliJ IDEA 2021.2.1libidea_rt.jar;C:Program FilesJetBrainsIntelliJ IDEA 2021.2.1pluginsjunitlibjunit5-rt.jar;C:Program FilesJetBrainsIntelliJ IDEA 2021.2.1pluginsjunitlibjunit-rt.jar;C:Program Files (x86)Javajdk1.8.0_291jrelibcharsets.jar;C:Program Files (x86)Javajdk1.8.0_291jrelibdeploy.jar;C:Program Files (x86)Javajdk1.8.0_291jrelibextaccess-bridge-32.jar;C:Program Files (x86)Javajdk1.8.0_291jrelibextcldrdata.jar;C:Program Files (x86)Javajdk1.8.0_291jrelibextdnsns.jar;C:Program Files (x86)Javajdk1.8.0_291jrelibextjaccess.jar;C:Program Files (x86)Javajdk1.8.0_291jrelibextjfxrt.jar;C:Program Files (x86)Javajdk1.8.0_291jrelibextlocaledata.jar;C:Program Files (x86)Javajdk1.8.0_291jrelibext
ashorn.jar;C:Program Files (x86)Javajdk1.8.0_291jrelibextsunec.jar;C:Program Files (x86)Javajdk1.8.0_291jrelibextsunjce_provider.jar;C:Program Files (x86)Javajdk1.8.0_291jrelibextsunmscapi.jar;C:Program Files (x86)Javajdk1.8.0_291jrelibextsunpkcs11.jar;C:Program Files (x86)Javajdk1.8.0_291jrelibextzipfs.jar;C:Program Files (x86)Javajdk1.8.0_291jrelibjavaws.jar;C:Program Files (x86)Javajdk1.8.0_291jrelibjce.jar;C:Program Files (x86)Javajdk1.8.0_291jrelibjfr.jar;C:Program Files (x86)Javajdk1.8.0_291jrelibjfxswt.jar;C:Program Files (x86)Javajdk1.8.0_291jrelibjsse.jar;C:Program Files (x86)Javajdk1.8.0_291jrelibmanagement-agent.jar;C:Program Files (x86)Javajdk1.8.0_291jrelibplugin.jar;C:Program Files (x86)Javajdk1.8.0_291jrelib
esources.jar;C:Program Files (x86)Javajdk1.8.0_291jrelib
t.jar;C:UsersAdministratorIdeaProjectsRabbitMQSpring-RabbitMQ-Producer	arget	est-classes;C:UsersAdministratorIdeaProjectsRabbitMQSpring-RabbitMQ-Producer	argetclasses;C:UsersAdministrator.m2
epositoryorgspringframeworkspring-context5.3.10spring-context-5.3.10.jar;C:UsersAdministrator.m2
epositoryorgspringframeworkspring-aop5.3.10spring-aop-5.3.10.jar;C:UsersAdministrator.m2
epositoryorgspringframeworkspring-beans5.3.10spring-beans-5.3.10.jar;C:UsersAdministrator.m2
epositoryorgspringframeworkspring-core5.3.10spring-core-5.3.10.jar;C:UsersAdministrator.m2
epositoryorgspringframeworkspring-jcl5.3.10spring-jcl-5.3.10.jar;C:UsersAdministrator.m2
epositoryorgspringframeworkspring-expression5.3.10spring-expression-5.3.10.jar;C:UsersAdministrator.m2
epositoryorgspringframeworkamqpspring-rabbit2.1.8.RELEASEspring-rabbit-2.1.8.RELEASE.jar;C:UsersAdministrator.m2
epositoryorgspringframeworkamqpspring-amqp2.1.8.RELEASEspring-amqp-2.1.8.RELEASE.jar;C:UsersAdministrator.m2
epositoryorgspringframework
etryspring-retry1.2.4.RELEASEspring-retry-1.2.4.RELEASE.jar;C:UsersAdministrator.m2
epositorycom
abbitmqamqp-client5.4.3amqp-client-5.4.3.jar;C:UsersAdministrator.m2
epositoryorgslf4jslf4j-api1.7.25slf4j-api-1.7.25.jar;C:UsersAdministrator.m2
epositoryorgspringframeworkspring-messaging5.1.9.RELEASEspring-messaging-5.1.9.RELEASE.jar;C:UsersAdministrator.m2
epositoryorgspringframeworkspring-tx5.1.9.RELEASEspring-tx-5.1.9.RELEASE.jar;C:UsersAdministrator.m2
epositoryorgspringframeworkspring-test5.3.10spring-test-5.3.10.jar;C:UsersAdministrator.m2
epositoryjunitjunit4.13.2junit-4.13.2.jar;C:UsersAdministrator.m2
epositoryorghamcresthamcrest-core1.3hamcrest-core-1.3.jar" com.intellij.rt.junit.JUnitStarter -ideVersion5 -junit4 cn.dzz.SpringProducerTest,sendingReliableTest
SLF4J: Failed to load class "org.slf4j.impl.StaticLoggerBinder".
SLF4J: Defaulting to no-operation (NOP) logger implementation
SLF4J: See http://www.slf4j.org/codes.html#StaticLoggerBinder for further details.
确认消息真的从生产者服务发送到了RabbitMQ中间件这里, 然后这个周期的时刻需要做的什么事情 。。。。
rabbitMQ收到消息了 null

Process finished with exit code 0

如果更改错误的配置:

把交换机故意写错,

rabbitTemplate.convertAndSend("confirm-test-exchange222", "confirm", " 发送一条消息以测试confirm回调。。。。");

然后则输出:

"C:Program Files (x86)Javajdk1.8.0_291injava.exe" -ea -Didea.test.cyclic.buffer.size=1048576 "-javaagent:C:Program FilesJetBrainsIntelliJ IDEA 2021.2.1libidea_rt.jar=51948:C:Program FilesJetBrainsIntelliJ IDEA 2021.2.1in" -Dfile.encoding=UTF-8 -classpath "C:Program FilesJetBrainsIntelliJ IDEA 2021.2.1libidea_rt.jar;C:Program FilesJetBrainsIntelliJ IDEA 2021.2.1pluginsjunitlibjunit5-rt.jar;C:Program FilesJetBrainsIntelliJ IDEA 2021.2.1pluginsjunitlibjunit-rt.jar;C:Program Files (x86)Javajdk1.8.0_291jrelibcharsets.jar;C:Program Files (x86)Javajdk1.8.0_291jrelibdeploy.jar;C:Program Files (x86)Javajdk1.8.0_291jrelibextaccess-bridge-32.jar;C:Program Files (x86)Javajdk1.8.0_291jrelibextcldrdata.jar;C:Program Files (x86)Javajdk1.8.0_291jrelibextdnsns.jar;C:Program Files (x86)Javajdk1.8.0_291jrelibextjaccess.jar;C:Program Files (x86)Javajdk1.8.0_291jrelibextjfxrt.jar;C:Program Files (x86)Javajdk1.8.0_291jrelibextlocaledata.jar;C:Program Files (x86)Javajdk1.8.0_291jrelibext
ashorn.jar;C:Program Files (x86)Javajdk1.8.0_291jrelibextsunec.jar;C:Program Files (x86)Javajdk1.8.0_291jrelibextsunjce_provider.jar;C:Program Files (x86)Javajdk1.8.0_291jrelibextsunmscapi.jar;C:Program Files (x86)Javajdk1.8.0_291jrelibextsunpkcs11.jar;C:Program Files (x86)Javajdk1.8.0_291jrelibextzipfs.jar;C:Program Files (x86)Javajdk1.8.0_291jrelibjavaws.jar;C:Program Files (x86)Javajdk1.8.0_291jrelibjce.jar;C:Program Files (x86)Javajdk1.8.0_291jrelibjfr.jar;C:Program Files (x86)Javajdk1.8.0_291jrelibjfxswt.jar;C:Program Files (x86)Javajdk1.8.0_291jrelibjsse.jar;C:Program Files (x86)Javajdk1.8.0_291jrelibmanagement-agent.jar;C:Program Files (x86)Javajdk1.8.0_291jrelibplugin.jar;C:Program Files (x86)Javajdk1.8.0_291jrelib
esources.jar;C:Program Files (x86)Javajdk1.8.0_291jrelib
t.jar;C:UsersAdministratorIdeaProjectsRabbitMQSpring-RabbitMQ-Producer	arget	est-classes;C:UsersAdministratorIdeaProjectsRabbitMQSpring-RabbitMQ-Producer	argetclasses;C:UsersAdministrator.m2
epositoryorgspringframeworkspring-context5.3.10spring-context-5.3.10.jar;C:UsersAdministrator.m2
epositoryorgspringframeworkspring-aop5.3.10spring-aop-5.3.10.jar;C:UsersAdministrator.m2
epositoryorgspringframeworkspring-beans5.3.10spring-beans-5.3.10.jar;C:UsersAdministrator.m2
epositoryorgspringframeworkspring-core5.3.10spring-core-5.3.10.jar;C:UsersAdministrator.m2
epositoryorgspringframeworkspring-jcl5.3.10spring-jcl-5.3.10.jar;C:UsersAdministrator.m2
epositoryorgspringframeworkspring-expression5.3.10spring-expression-5.3.10.jar;C:UsersAdministrator.m2
epositoryorgspringframeworkamqpspring-rabbit2.1.8.RELEASEspring-rabbit-2.1.8.RELEASE.jar;C:UsersAdministrator.m2
epositoryorgspringframeworkamqpspring-amqp2.1.8.RELEASEspring-amqp-2.1.8.RELEASE.jar;C:UsersAdministrator.m2
epositoryorgspringframework
etryspring-retry1.2.4.RELEASEspring-retry-1.2.4.RELEASE.jar;C:UsersAdministrator.m2
epositorycom
abbitmqamqp-client5.4.3amqp-client-5.4.3.jar;C:UsersAdministrator.m2
epositoryorgslf4jslf4j-api1.7.25slf4j-api-1.7.25.jar;C:UsersAdministrator.m2
epositoryorgspringframeworkspring-messaging5.1.9.RELEASEspring-messaging-5.1.9.RELEASE.jar;C:UsersAdministrator.m2
epositoryorgspringframeworkspring-tx5.1.9.RELEASEspring-tx-5.1.9.RELEASE.jar;C:UsersAdministrator.m2
epositoryorgspringframeworkspring-test5.3.10spring-test-5.3.10.jar;C:UsersAdministrator.m2
epositoryjunitjunit4.13.2junit-4.13.2.jar;C:UsersAdministrator.m2
epositoryorghamcresthamcrest-core1.3hamcrest-core-1.3.jar" com.intellij.rt.junit.JUnitStarter -ideVersion5 -junit4 cn.dzz.SpringProducerTest,sendingReliableTest
SLF4J: Failed to load class "org.slf4j.impl.StaticLoggerBinder".
SLF4J: Defaulting to no-operation (NOP) logger implementation
SLF4J: See http://www.slf4j.org/codes.html#StaticLoggerBinder for further details.
确认消息真的从生产者服务发送到了RabbitMQ中间件这里, 然后这个周期的时刻需要做的什么事情 。。。。
rabbitMQ没收到消息 : cause by channel error; protocol method: #method<channel.close>(reply-code=404, reply-text=NOT_FOUND - no exchange 'confirm-test-exchange222' in vhost '/dzz', class-id=60, method-id=40)

Process finished with exit code 0

2、消息投递回退

<?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:context="http://www.springframework.org/schema/context"
       xmlns:rabbit="http://www.springframework.org/schema/rabbit"
       xsi:schemaLocation="http://www.springframework.org/schema/beans
       http://www.springframework.org/schema/beans/spring-beans.xsd
       http://www.springframework.org/schema/context
       https://www.springframework.org/schema/context/spring-context.xsd
       http://www.springframework.org/schema/rabbit
       http://www.springframework.org/schema/rabbit/spring-rabbit.xsd">
    <!--加载配置文件-->
    <context:property-placeholder location="classpath:rabbitmq.properties"/>

    <!-- 定义rabbitmq connectionFactory

        publisher-confirms="true" 消息发送可确认
        publisher-returns="true"
    -->
    <rabbit:connection-factory id="connectionFactory" host="${rabbitmq.host}"
                               port="${rabbitmq.port}"
                               username="${rabbitmq.username}"
                               password="${rabbitmq.password}"
                               virtual-host="${rabbitmq.virtual-host}"
                               publisher-confirms="true"
                               publisher-returns="true"
    />
    <!--定义管理交换机、队列-->
    <rabbit:admin connection-factory="connectionFactory"/>

    <!--定义rabbitTemplate对象操作可以在代码中方便发送消息-->
    <rabbit:template id="rabbitTemplate" connection-factory="connectionFactory"/>
    
    <!-- 消息可靠性投递 -->
    <rabbit:queue id="confirm-test-queue" name="confirm-test-queue" />
    <rabbit:direct-exchange name="confirm-test-exchange" >
        <rabbit:bindings>
            <rabbit:binding queue="confirm-test-queue" key="confirm" />
        </rabbit:bindings>
    </rabbit:direct-exchange>
    

</beans>

测试类编写:

package cn.dzz;

import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.amqp.core.Message;
import org.springframework.amqp.rabbit.connection.CorrelationData;
import org.springframework.amqp.rabbit.core.RabbitTemplate;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.test.context.ContextConfiguration;
import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;

@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(locations = "classpath*:producer-config.xml")
public class SpringProducerTest {

    @Autowired
    private RabbitTemplate rabbitTemplate;

    /**
     * 消息送出可靠性测试
     * 1、xml配置数据连接工厂开启消息可确认设置 √
     * 2、rabbitTemplate对象定义回调函数
     */
    @Test
    public void sendingReliableTest() {

        /**
         *  CorrelationData correlationData相关配置信息
         *  boolean ack 来自交换机收到消息的确认参数 true收到了 false没收到
         *  String cause 失败的原因信息 发送成功了就没有失败原因 case为null
         */
        rabbitTemplate.setConfirmCallback((correlationData, ack, cause) -> {
            System.out.println("确认消息真的从生产者服务发送到了RabbitMQ中间件这里, 然后这个周期的时刻需要做的什么事情 。。。。");
            if (ack) {
                System.out.println("rabbitMQ收到消息了 " + cause);
            } else {
                System.out.println("rabbitMQ没收到消息 : cause by " + cause);
                // 如果没收到就需要做对应的处理逻辑
            }
        });
        rabbitTemplate.convertAndSend("confirm-test-exchange", "confirm", " 发送一条消息以测试confirm回调。。。。");
    }

    /**
     * 消息发送给Exchange后, Exchange路由分配给Queue的过程发生了失败,触发ReturnCallBack
     * 1、开启回退配置项
     * 2、重写回退函数
     * 3、设置交换机处理消息的模式
     *
     */
    @Test
    public void sendingReliableTest2() {

        // 设置交换机处理消息的模式 把发送失败的消息返回给生产者服务, 生产者服务把消息丢尽这个return回调里面
        rabbitTemplate.setMandatory(true);

        /**
         *
         * @param Message message 交换机分配队列失败的送出消息
         * @param int i 错误状态码
         * @param String s 错误原因
         * @param String s1 交换机名称
         * @param String s2 路由键
         */
        rabbitTemplate.setReturnCallback((message, i, s, s1, s2) -> {
            System.out.println("交换机分配到队列过程失败, ReturnCallback触发....");
            System.out.println(
                    "backed message -> " + message
                    + "
statusCode -> " + i
                    + "
reason -> " + s
                    + "
exchangeName -> " + s1
                    + "
routineKey -> " + s2
            );
        });

        // 这里故意设置错误的路由键,让交换机无法分配到,从而触发上面这个函数
        rabbitTemplate.convertAndSend("confirm-test-exchange", "confirm222", " 发送一条消息以测试confirm回调。。。。");
    }

}

结果打印:

"C:Program Files (x86)Javajdk1.8.0_291injava.exe" -ea -Didea.test.cyclic.buffer.size=1048576 "-javaagent:C:Program FilesJetBrainsIntelliJ IDEA 2021.2.1libidea_rt.jar=55082:C:Program FilesJetBrainsIntelliJ IDEA 2021.2.1in" -Dfile.encoding=UTF-8 -classpath "C:Program FilesJetBrainsIntelliJ IDEA 2021.2.1libidea_rt.jar;C:Program FilesJetBrainsIntelliJ IDEA 2021.2.1pluginsjunitlibjunit5-rt.jar;C:Program FilesJetBrainsIntelliJ IDEA 2021.2.1pluginsjunitlibjunit-rt.jar;C:Program Files (x86)Javajdk1.8.0_291jrelibcharsets.jar;C:Program Files (x86)Javajdk1.8.0_291jrelibdeploy.jar;C:Program Files (x86)Javajdk1.8.0_291jrelibextaccess-bridge-32.jar;C:Program Files (x86)Javajdk1.8.0_291jrelibextcldrdata.jar;C:Program Files (x86)Javajdk1.8.0_291jrelibextdnsns.jar;C:Program Files (x86)Javajdk1.8.0_291jrelibextjaccess.jar;C:Program Files (x86)Javajdk1.8.0_291jrelibextjfxrt.jar;C:Program Files (x86)Javajdk1.8.0_291jrelibextlocaledata.jar;C:Program Files (x86)Javajdk1.8.0_291jrelibext
ashorn.jar;C:Program Files (x86)Javajdk1.8.0_291jrelibextsunec.jar;C:Program Files (x86)Javajdk1.8.0_291jrelibextsunjce_provider.jar;C:Program Files (x86)Javajdk1.8.0_291jrelibextsunmscapi.jar;C:Program Files (x86)Javajdk1.8.0_291jrelibextsunpkcs11.jar;C:Program Files (x86)Javajdk1.8.0_291jrelibextzipfs.jar;C:Program Files (x86)Javajdk1.8.0_291jrelibjavaws.jar;C:Program Files (x86)Javajdk1.8.0_291jrelibjce.jar;C:Program Files (x86)Javajdk1.8.0_291jrelibjfr.jar;C:Program Files (x86)Javajdk1.8.0_291jrelibjfxswt.jar;C:Program Files (x86)Javajdk1.8.0_291jrelibjsse.jar;C:Program Files (x86)Javajdk1.8.0_291jrelibmanagement-agent.jar;C:Program Files (x86)Javajdk1.8.0_291jrelibplugin.jar;C:Program Files (x86)Javajdk1.8.0_291jrelib
esources.jar;C:Program Files (x86)Javajdk1.8.0_291jrelib
t.jar;C:UsersAdministratorIdeaProjectsRabbitMQSpring-RabbitMQ-Producer	arget	est-classes;C:UsersAdministratorIdeaProjectsRabbitMQSpring-RabbitMQ-Producer	argetclasses;C:UsersAdministrator.m2
epositoryorgspringframeworkspring-context5.3.10spring-context-5.3.10.jar;C:UsersAdministrator.m2
epositoryorgspringframeworkspring-aop5.3.10spring-aop-5.3.10.jar;C:UsersAdministrator.m2
epositoryorgspringframeworkspring-beans5.3.10spring-beans-5.3.10.jar;C:UsersAdministrator.m2
epositoryorgspringframeworkspring-core5.3.10spring-core-5.3.10.jar;C:UsersAdministrator.m2
epositoryorgspringframeworkspring-jcl5.3.10spring-jcl-5.3.10.jar;C:UsersAdministrator.m2
epositoryorgspringframeworkspring-expression5.3.10spring-expression-5.3.10.jar;C:UsersAdministrator.m2
epositoryorgspringframeworkamqpspring-rabbit2.1.8.RELEASEspring-rabbit-2.1.8.RELEASE.jar;C:UsersAdministrator.m2
epositoryorgspringframeworkamqpspring-amqp2.1.8.RELEASEspring-amqp-2.1.8.RELEASE.jar;C:UsersAdministrator.m2
epositoryorgspringframework
etryspring-retry1.2.4.RELEASEspring-retry-1.2.4.RELEASE.jar;C:UsersAdministrator.m2
epositorycom
abbitmqamqp-client5.4.3amqp-client-5.4.3.jar;C:UsersAdministrator.m2
epositoryorgslf4jslf4j-api1.7.25slf4j-api-1.7.25.jar;C:UsersAdministrator.m2
epositoryorgspringframeworkspring-messaging5.1.9.RELEASEspring-messaging-5.1.9.RELEASE.jar;C:UsersAdministrator.m2
epositoryorgspringframeworkspring-tx5.1.9.RELEASEspring-tx-5.1.9.RELEASE.jar;C:UsersAdministrator.m2
epositoryorgspringframeworkspring-test5.3.10spring-test-5.3.10.jar;C:UsersAdministrator.m2
epositoryjunitjunit4.13.2junit-4.13.2.jar;C:UsersAdministrator.m2
epositoryorghamcresthamcrest-core1.3hamcrest-core-1.3.jar" com.intellij.rt.junit.JUnitStarter -ideVersion5 -junit4 cn.dzz.SpringProducerTest,sendingReliableTest2
SLF4J: Failed to load class "org.slf4j.impl.StaticLoggerBinder".
SLF4J: Defaulting to no-operation (NOP) logger implementation
SLF4J: See http://www.slf4j.org/codes.html#StaticLoggerBinder for further details.
交换机分配到队列过程失败, ReturnCallback触发....
backed message -> (Body:' 发送一条消息以测试confirm回调。。。。' MessageProperties [headers={}, contentType=text/plain, contentEncoding=UTF-8, contentLength=0, receivedDeliveryMode=PERSISTENT, priority=0, deliveryTag=0])
statusCode -> 312
reason -> NO_ROUTE
exchangeName -> confirm-test-exchange
routineKey -> confirm222

Process finished with exit code 0

3、消费确认

Ack 确认的意思,即消费者服务收到了来自RabbitMQ队列发送的消息之后,需要做出回应

这个过程就是确认

确认的三种方式

1、自动确认,RabbitMQ发送给消费者服务之后默认认为确认已收到

2、手动确认,等待消费者做出回应之后确认

3、根据异常来进行确认

演示案例:

<?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:context="http://www.springframework.org/schema/context"
       xmlns:rabbit="http://www.springframework.org/schema/rabbit"
       xsi:schemaLocation="http://www.springframework.org/schema/beans
       http://www.springframework.org/schema/beans/spring-beans.xsd
       http://www.springframework.org/schema/context
       https://www.springframework.org/schema/context/spring-context.xsd
       http://www.springframework.org/schema/rabbit
       http://www.springframework.org/schema/rabbit/spring-rabbit.xsd">
    <!--加载配置文件-->
    <context:property-placeholder location="classpath:rabbitmq.properties"/>

    <!-- 定义rabbitmq connectionFactory -->
    <rabbit:connection-factory id="connectionFactory" host="${rabbitmq.host}"
                               port="${rabbitmq.port}"
                               username="${rabbitmq.username}"
                               password="${rabbitmq.password}"
                               virtual-host="${rabbitmq.virtual-host}"/>

    <context:component-scan base-package="cn.dzz.rabbitmq.listener" />

    <!--定义监听器容器-->
    <rabbit:listener-container connection-factory="connectionFactory" auto-declare="true">
        <rabbit:listener ref="acknowledgeListener" queue-names="confirm-test-queue" />
    </rabbit:listener-container>

</beans>

监听器注册:

package cn.dzz.rabbitmq.listener;

import org.springframework.amqp.core.Message;
import org.springframework.amqp.core.MessageListener;
import org.springframework.stereotype.Component;

import java.nio.charset.StandardCharsets;

@Component
public class AcknowledgeListener implements MessageListener {
    @Override
    public void onMessage(Message message) {
        System.out.println(new String(message.getBody(), StandardCharsets.UTF_8));
    }
}

测试监听器接收消息是否正常:

"C:Program Files (x86)Javajdk1.8.0_291injava.exe" -ea -Didea.test.cyclic.buffer.size=1048576 "-javaagent:C:Program FilesJetBrainsIntelliJ IDEA 2021.2.1libidea_rt.jar=65001:C:Program FilesJetBrainsIntelliJ IDEA 2021.2.1in" -Dfile.encoding=UTF-8 -classpath "C:Program FilesJetBrainsIntelliJ IDEA 2021.2.1libidea_rt.jar;C:Program FilesJetBrainsIntelliJ IDEA 2021.2.1pluginsjunitlibjunit5-rt.jar;C:Program FilesJetBrainsIntelliJ IDEA 2021.2.1pluginsjunitlibjunit-rt.jar;C:Program Files (x86)Javajdk1.8.0_291jrelibcharsets.jar;C:Program Files (x86)Javajdk1.8.0_291jrelibdeploy.jar;C:Program Files (x86)Javajdk1.8.0_291jrelibextaccess-bridge-32.jar;C:Program Files (x86)Javajdk1.8.0_291jrelibextcldrdata.jar;C:Program Files (x86)Javajdk1.8.0_291jrelibextdnsns.jar;C:Program Files (x86)Javajdk1.8.0_291jrelibextjaccess.jar;C:Program Files (x86)Javajdk1.8.0_291jrelibextjfxrt.jar;C:Program Files (x86)Javajdk1.8.0_291jrelibextlocaledata.jar;C:Program Files (x86)Javajdk1.8.0_291jrelibext
ashorn.jar;C:Program Files (x86)Javajdk1.8.0_291jrelibextsunec.jar;C:Program Files (x86)Javajdk1.8.0_291jrelibextsunjce_provider.jar;C:Program Files (x86)Javajdk1.8.0_291jrelibextsunmscapi.jar;C:Program Files (x86)Javajdk1.8.0_291jrelibextsunpkcs11.jar;C:Program Files (x86)Javajdk1.8.0_291jrelibextzipfs.jar;C:Program Files (x86)Javajdk1.8.0_291jrelibjavaws.jar;C:Program Files (x86)Javajdk1.8.0_291jrelibjce.jar;C:Program Files (x86)Javajdk1.8.0_291jrelibjfr.jar;C:Program Files (x86)Javajdk1.8.0_291jrelibjfxswt.jar;C:Program Files (x86)Javajdk1.8.0_291jrelibjsse.jar;C:Program Files (x86)Javajdk1.8.0_291jrelibmanagement-agent.jar;C:Program Files (x86)Javajdk1.8.0_291jrelibplugin.jar;C:Program Files (x86)Javajdk1.8.0_291jrelib
esources.jar;C:Program Files (x86)Javajdk1.8.0_291jrelib
t.jar;C:UsersAdministratorIdeaProjectsRabbitMQSpring-RabbitMQ-Consumer	arget	est-classes;C:UsersAdministratorIdeaProjectsRabbitMQSpring-RabbitMQ-Consumer	argetclasses;C:UsersAdministrator.m2
epositoryorgspringframeworkspring-context5.3.10spring-context-5.3.10.jar;C:UsersAdministrator.m2
epositoryorgspringframeworkspring-aop5.3.10spring-aop-5.3.10.jar;C:UsersAdministrator.m2
epositoryorgspringframeworkspring-beans5.3.10spring-beans-5.3.10.jar;C:UsersAdministrator.m2
epositoryorgspringframeworkspring-core5.3.10spring-core-5.3.10.jar;C:UsersAdministrator.m2
epositoryorgspringframeworkspring-jcl5.3.10spring-jcl-5.3.10.jar;C:UsersAdministrator.m2
epositoryorgspringframeworkspring-expression5.3.10spring-expression-5.3.10.jar;C:UsersAdministrator.m2
epositoryorgspringframeworkamqpspring-rabbit2.1.8.RELEASEspring-rabbit-2.1.8.RELEASE.jar;C:UsersAdministrator.m2
epositoryorgspringframeworkamqpspring-amqp2.1.8.RELEASEspring-amqp-2.1.8.RELEASE.jar;C:UsersAdministrator.m2
epositoryorgspringframework
etryspring-retry1.2.4.RELEASEspring-retry-1.2.4.RELEASE.jar;C:UsersAdministrator.m2
epositorycom
abbitmqamqp-client5.4.3amqp-client-5.4.3.jar;C:UsersAdministrator.m2
epositoryorgslf4jslf4j-api1.7.25slf4j-api-1.7.25.jar;C:UsersAdministrator.m2
epositoryorgspringframeworkspring-messaging5.1.9.RELEASEspring-messaging-5.1.9.RELEASE.jar;C:UsersAdministrator.m2
epositoryorgspringframeworkspring-tx5.1.9.RELEASEspring-tx-5.1.9.RELEASE.jar;C:UsersAdministrator.m2
epositoryorgspringframeworkspring-test5.3.10spring-test-5.3.10.jar;C:UsersAdministrator.m2
epositoryjunitjunit4.13.2junit-4.13.2.jar;C:UsersAdministrator.m2
epositoryorghamcresthamcrest-core1.3hamcrest-core-1.3.jar" com.intellij.rt.junit.JUnitStarter -ideVersion5 -junit4 SpringConsumerTest,simpleListenerTest
SLF4J: Failed to load class "org.slf4j.impl.StaticLoggerBinder".
SLF4J: Defaulting to no-operation (NOP) logger implementation
SLF4J: See http://www.slf4j.org/codes.html#StaticLoggerBinder for further details.
 发送一条消息以测试confirm回调。。。。
监听测试

Process finished with exit code 0

RabbitMQ默认状态是使用none表示确认状态

手动签收确认的配置:

<?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:context="http://www.springframework.org/schema/context"
       xmlns:rabbit="http://www.springframework.org/schema/rabbit"
       xsi:schemaLocation="http://www.springframework.org/schema/beans
       http://www.springframework.org/schema/beans/spring-beans.xsd
       http://www.springframework.org/schema/context
       https://www.springframework.org/schema/context/spring-context.xsd
       http://www.springframework.org/schema/rabbit
       http://www.springframework.org/schema/rabbit/spring-rabbit.xsd">
    <!--加载配置文件-->
    <context:property-placeholder location="classpath:rabbitmq.properties"/>

    <!-- 定义rabbitmq connectionFactory -->
    <rabbit:connection-factory id="connectionFactory" host="${rabbitmq.host}"
                               port="${rabbitmq.port}"
                               username="${rabbitmq.username}"
                               password="${rabbitmq.password}"
                               virtual-host="${rabbitmq.virtual-host}"/>

    <context:component-scan base-package="cn.dzz.rabbitmq.listener" />

    <!--
        定义监听器容器

        acknowledge="manual" 默认就是none
    -->
    <rabbit:listener-container connection-factory="connectionFactory" auto-declare="true" acknowledge="manual">
        <rabbit:listener ref="acknowledgeListener" queue-names="confirm-test-queue" />
    </rabbit:listener-container>

</beans>

监听器实现调整:

package cn.dzz.rabbitmq.listener;

import com.rabbitmq.client.Channel;
import org.springframework.amqp.core.Message;
import org.springframework.amqp.core.MessageListener;
import org.springframework.amqp.rabbit.listener.api.ChannelAwareMessageListener;
import org.springframework.stereotype.Component;

import java.io.IOException;
import java.nio.charset.StandardCharsets;

/**
 * 手动确认配置:
 * 1、监听器容器配置项acknowledge更改为manual
 * <rabbit:listener-container connection-factory="connectionFactory" auto-declare="true" acknowledge="manual">
 *   <rabbit:listener ref="acknowledgeListener" queue-names="confirm-test-queue" />
 * </rabbit:listener-container>
 *
 * 2、监听器改用实现ChannelAwareMessageListener接口
 *
 * 3、消息处理成功 调用basicAck()签收响应
 * 4、处理失败 调用basicNack()签收拒绝 broker重新发送
 *
 *
 */
@Component
public class AcknowledgeListener implements ChannelAwareMessageListener {
    @Override
    public void onMessage(Message message, Channel channel) throws Exception {
        long deliveryTag = 0;
        Thread.sleep(2000); // 让消息别那么快的一直发送,慢点发

        try {

            System.out.println(new String(message.getBody(), StandardCharsets.UTF_8));

            // 处理业务逻辑
            // todo...

            int i = 10 / 0; // 这个异常会被捕获,然后触发RabbitMQ一直让消息重新入列发送

            // 业务签收
            deliveryTag = message.getMessageProperties().getDeliveryTag();

            channel.basicAck(deliveryTag, true);

        } catch (Exception exception) {
            exception.printStackTrace();

            /**
             *     public void basicNack(long deliveryTag, boolean multiple, boolean requeue) throws IOException {
             *         long realTag = deliveryTag - this.activeDeliveryTagOffset;
             *         if (multiple && deliveryTag == 0L) {
             *             realTag = 0L;
             *         } else if (realTag <= 0L) {
             *             return;
             *         }
             *
             *         this.transmit(new Nack(realTag, multiple, requeue));
             *         this.metricsCollector.basicNack(this, deliveryTag);
             *     }
             *     long deliveryTag 签收的标签
             *     boolean multiple 允许签收多条消息?
             *     boolean requeue 是否重回队列? 消息重新入列?RabbitMQ重新发送
             */
            channel.basicNack(deliveryTag, true, true);

            /**
             * 和上面区别就是没有多消息签收的参数
             *     public void basicReject(long deliveryTag, boolean requeue) throws IOException {
             *         long realTag = deliveryTag - this.activeDeliveryTagOffset;
             *         if (realTag > 0L) {
             *             this.transmit(new Reject(realTag, requeue));
             *             this.metricsCollector.basicReject(this, deliveryTag);
             *         }
             *
             *     }
             *     channel.basicReject(deliveryTag, true);
             */

        }
    }
}

报错之后 执行拒绝签收,RabbitMQ会一直重新发送消息

消息状态处于一直未签收的状态:

 

异常处理的两个方法区别:就是Nack可以处理多条消息,Reject只能一条

"C:Program Files (x86)Javajdk1.8.0_291injava.exe" -ea -Didea.test.cyclic.buffer.size=1048576 "-javaagent:C:Program FilesJetBrainsIntelliJ IDEA 2021.2.1libidea_rt.jar=50417:C:Program FilesJetBrainsIntelliJ IDEA 2021.2.1in" -Dfile.encoding=UTF-8 -classpath "C:Program FilesJetBrainsIntelliJ IDEA 2021.2.1libidea_rt.jar;C:Program FilesJetBrainsIntelliJ IDEA 2021.2.1pluginsjunitlibjunit5-rt.jar;C:Program FilesJetBrainsIntelliJ IDEA 2021.2.1pluginsjunitlibjunit-rt.jar;C:Program Files (x86)Javajdk1.8.0_291jrelibcharsets.jar;C:Program Files (x86)Javajdk1.8.0_291jrelibdeploy.jar;C:Program Files (x86)Javajdk1.8.0_291jrelibextaccess-bridge-32.jar;C:Program Files (x86)Javajdk1.8.0_291jrelibextcldrdata.jar;C:Program Files (x86)Javajdk1.8.0_291jrelibextdnsns.jar;C:Program Files (x86)Javajdk1.8.0_291jrelibextjaccess.jar;C:Program Files (x86)Javajdk1.8.0_291jrelibextjfxrt.jar;C:Program Files (x86)Javajdk1.8.0_291jrelibextlocaledata.jar;C:Program Files (x86)Javajdk1.8.0_291jrelibext
ashorn.jar;C:Program Files (x86)Javajdk1.8.0_291jrelibextsunec.jar;C:Program Files (x86)Javajdk1.8.0_291jrelibextsunjce_provider.jar;C:Program Files (x86)Javajdk1.8.0_291jrelibextsunmscapi.jar;C:Program Files (x86)Javajdk1.8.0_291jrelibextsunpkcs11.jar;C:Program Files (x86)Javajdk1.8.0_291jrelibextzipfs.jar;C:Program Files (x86)Javajdk1.8.0_291jrelibjavaws.jar;C:Program Files (x86)Javajdk1.8.0_291jrelibjce.jar;C:Program Files (x86)Javajdk1.8.0_291jrelibjfr.jar;C:Program Files (x86)Javajdk1.8.0_291jrelibjfxswt.jar;C:Program Files (x86)Javajdk1.8.0_291jrelibjsse.jar;C:Program Files (x86)Javajdk1.8.0_291jrelibmanagement-agent.jar;C:Program Files (x86)Javajdk1.8.0_291jrelibplugin.jar;C:Program Files (x86)Javajdk1.8.0_291jrelib
esources.jar;C:Program Files (x86)Javajdk1.8.0_291jrelib
t.jar;C:UsersAdministratorIdeaProjectsRabbitMQSpring-RabbitMQ-Consumer	arget	est-classes;C:UsersAdministratorIdeaProjectsRabbitMQSpring-RabbitMQ-Consumer	argetclasses;C:UsersAdministrator.m2
epositoryorgspringframeworkspring-context5.3.10spring-context-5.3.10.jar;C:UsersAdministrator.m2
epositoryorgspringframeworkspring-aop5.3.10spring-aop-5.3.10.jar;C:UsersAdministrator.m2
epositoryorgspringframeworkspring-beans5.3.10spring-beans-5.3.10.jar;C:UsersAdministrator.m2
epositoryorgspringframeworkspring-core5.3.10spring-core-5.3.10.jar;C:UsersAdministrator.m2
epositoryorgspringframeworkspring-jcl5.3.10spring-jcl-5.3.10.jar;C:UsersAdministrator.m2
epositoryorgspringframeworkspring-expression5.3.10spring-expression-5.3.10.jar;C:UsersAdministrator.m2
epositoryorgspringframeworkamqpspring-rabbit2.1.8.RELEASEspring-rabbit-2.1.8.RELEASE.jar;C:UsersAdministrator.m2
epositoryorgspringframeworkamqpspring-amqp2.1.8.RELEASEspring-amqp-2.1.8.RELEASE.jar;C:UsersAdministrator.m2
epositoryorgspringframework
etryspring-retry1.2.4.RELEASEspring-retry-1.2.4.RELEASE.jar;C:UsersAdministrator.m2
epositorycom
abbitmqamqp-client5.4.3amqp-client-5.4.3.jar;C:UsersAdministrator.m2
epositoryorgslf4jslf4j-api1.7.25slf4j-api-1.7.25.jar;C:UsersAdministrator.m2
epositoryorgspringframeworkspring-messaging5.1.9.RELEASEspring-messaging-5.1.9.RELEASE.jar;C:UsersAdministrator.m2
epositoryorgspringframeworkspring-tx5.1.9.RELEASEspring-tx-5.1.9.RELEASE.jar;C:UsersAdministrator.m2
epositoryorgspringframeworkspring-test5.3.10spring-test-5.3.10.jar;C:UsersAdministrator.m2
epositoryjunitjunit4.13.2junit-4.13.2.jar;C:UsersAdministrator.m2
epositoryorghamcresthamcrest-core1.3hamcrest-core-1.3.jar" com.intellij.rt.junit.JUnitStarter -ideVersion5 -junit4 SpringConsumerTest,simpleListenerTest
SLF4J: Failed to load class "org.slf4j.impl.StaticLoggerBinder".
SLF4J: Defaulting to no-operation (NOP) logger implementation
SLF4J: See http://www.slf4j.org/codes.html#StaticLoggerBinder for further details.
监听测试
 发送一条消息以测试confirm回调。。。。
java.lang.ArithmeticException: / by zero
    at cn.dzz.rabbitmq.listener.AcknowledgeListener.onMessage(AcknowledgeListener.java:40)
    at org.springframework.amqp.rabbit.listener.adapter.MessageListenerAdapter.onMessage(MessageListenerAdapter.java:272)
    at org.springframework.amqp.rabbit.listener.AbstractMessageListenerContainer.doInvokeListener(AbstractMessageListenerContainer.java:1542)
    at org.springframework.amqp.rabbit.listener.AbstractMessageListenerContainer.actualInvokeListener(AbstractMessageListenerContainer.java:1468)
    at org.springframework.amqp.rabbit.listener.AbstractMessageListenerContainer.invokeListener(AbstractMessageListenerContainer.java:1456)
    at org.springframework.amqp.rabbit.listener.AbstractMessageListenerContainer.doExecuteListener(AbstractMessageListenerContainer.java:1451)
    at org.springframework.amqp.rabbit.listener.AbstractMessageListenerContainer.executeListener(AbstractMessageListenerContainer.java:1400)
    at org.springframework.amqp.rabbit.listener.SimpleMessageListenerContainer.doReceiveAndExecute(SimpleMessageListenerContainer.java:870)
    at org.springframework.amqp.rabbit.listener.SimpleMessageListenerContainer.receiveAndExecute(SimpleMessageListenerContainer.java:854)
    at org.springframework.amqp.rabbit.listener.SimpleMessageListenerContainer.access$1600(SimpleMessageListenerContainer.java:78)
    at org.springframework.amqp.rabbit.listener.SimpleMessageListenerContainer$AsyncMessageProcessingConsumer.mainLoop(SimpleMessageListenerContainer.java:1137)
    at org.springframework.amqp.rabbit.listener.SimpleMessageListenerContainer$AsyncMessageProcessingConsumer.run(SimpleMessageListenerContainer.java:1043)
    at java.lang.Thread.run(Thread.java:748)
 发送一条消息以测试confirm回调。。。。
java.lang.ArithmeticException: / by zero
    at cn.dzz.rabbitmq.listener.AcknowledgeListener.onMessage(AcknowledgeListener.java:40)
    at org.springframework.amqp.rabbit.listener.adapter.MessageListenerAdapter.onMessage(MessageListenerAdapter.java:272)
    at org.springframework.amqp.rabbit.listener.AbstractMessageListenerContainer.doInvokeListener(AbstractMessageListenerContainer.java:1542)
    at org.springframework.amqp.rabbit.listener.AbstractMessageListenerContainer.actualInvokeListener(AbstractMessageListenerContainer.java:1468)
    at org.springframework.amqp.rabbit.listener.AbstractMessageListenerContainer.invokeListener(AbstractMessageListenerContainer.java:1456)
    at org.springframework.amqp.rabbit.listener.AbstractMessageListenerContainer.doExecuteListener(AbstractMessageListenerContainer.java:1451)
    at org.springframework.amqp.rabbit.listener.AbstractMessageListenerContainer.executeListener(AbstractMessageListenerContainer.java:1400)
    at org.springframework.amqp.rabbit.listener.SimpleMessageListenerContainer.doReceiveAndExecute(SimpleMessageListenerContainer.java:870)
    at org.springframework.amqp.rabbit.listener.SimpleMessageListenerContainer.receiveAndExecute(SimpleMessageListenerContainer.java:854)
    at org.springframework.amqp.rabbit.listener.SimpleMessageListenerContainer.access$1600(SimpleMessageListenerContainer.java:78)
    at org.springframework.amqp.rabbit.listener.SimpleMessageListenerContainer$AsyncMessageProcessingConsumer.mainLoop(SimpleMessageListenerContainer.java:1137)
    at org.springframework.amqp.rabbit.listener.SimpleMessageListenerContainer$AsyncMessageProcessingConsumer.run(SimpleMessageListenerContainer.java:1043)
    at java.lang.Thread.run(Thread.java:748)
 发送一条消息以测试confirm回调。。。。
java.lang.ArithmeticException: / by zero
    at cn.dzz.rabbitmq.listener.AcknowledgeListener.onMessage(AcknowledgeListener.java:40)
    at org.springframework.amqp.rabbit.listener.adapter.MessageListenerAdapter.onMessage(MessageListenerAdapter.java:272)
    at org.springframework.amqp.rabbit.listener.AbstractMessageListenerContainer.doInvokeListener(AbstractMessageListenerContainer.java:1542)
    at org.springframework.amqp.rabbit.listener.AbstractMessageListenerContainer.actualInvokeListener(AbstractMessageListenerContainer.java:1468)
    at org.springframework.amqp.rabbit.listener.AbstractMessageListenerContainer.invokeListener(AbstractMessageListenerContainer.java:1456)
    at org.springframework.amqp.rabbit.listener.AbstractMessageListenerContainer.doExecuteListener(AbstractMessageListenerContainer.java:1451)
    at org.springframework.amqp.rabbit.listener.AbstractMessageListenerContainer.executeListener(AbstractMessageListenerContainer.java:1400)
    at org.springframework.amqp.rabbit.listener.SimpleMessageListenerContainer.doReceiveAndExecute(SimpleMessageListenerContainer.java:870)
    at org.springframework.amqp.rabbit.listener.SimpleMessageListenerContainer.receiveAndExecute(SimpleMessageListenerContainer.java:854)
    at org.springframework.amqp.rabbit.listener.SimpleMessageListenerContainer.access$1600(SimpleMessageListenerContainer.java:78)
    at org.springframework.amqp.rabbit.listener.SimpleMessageListenerContainer$AsyncMessageProcessingConsumer.mainLoop(SimpleMessageListenerContainer.java:1137)
    at org.springframework.amqp.rabbit.listener.SimpleMessageListenerContainer$AsyncMessageProcessingConsumer.run(SimpleMessageListenerContainer.java:1043)
    at java.lang.Thread.run(Thread.java:748)
 发送一条消息以测试confirm回调。。。。
java.lang.ArithmeticException: / by zero
    at cn.dzz.rabbitmq.listener.AcknowledgeListener.onMessage(AcknowledgeListener.java:40)
    at org.springframework.amqp.rabbit.listener.adapter.MessageListenerAdapter.onMessage(MessageListenerAdapter.java:272)
    at org.springframework.amqp.rabbit.listener.AbstractMessageListenerContainer.doInvokeListener(AbstractMessageListenerContainer.java:1542)
    at org.springframework.amqp.rabbit.listener.AbstractMessageListenerContainer.actualInvokeListener(AbstractMessageListenerContainer.java:1468)
    at org.springframework.amqp.rabbit.listener.AbstractMessageListenerContainer.invokeListener(AbstractMessageListenerContainer.java:1456)
    at org.springframework.amqp.rabbit.listener.AbstractMessageListenerContainer.doExecuteListener(AbstractMessageListenerContainer.java:1451)
    at org.springframework.amqp.rabbit.listener.AbstractMessageListenerContainer.executeListener(AbstractMessageListenerContainer.java:1400)
    at org.springframework.amqp.rabbit.listener.SimpleMessageListenerContainer.doReceiveAndExecute(SimpleMessageListenerContainer.java:870)
    at org.springframework.amqp.rabbit.listener.SimpleMessageListenerContainer.receiveAndExecute(SimpleMessageListenerContainer.java:854)
    at org.springframework.amqp.rabbit.listener.SimpleMessageListenerContainer.access$1600(SimpleMessageListenerContainer.java:78)
    at org.springframework.amqp.rabbit.listener.SimpleMessageListenerContainer$AsyncMessageProcessingConsumer.mainLoop(SimpleMessageListenerContainer.java:1137)
    at org.springframework.amqp.rabbit.listener.SimpleMessageListenerContainer$AsyncMessageProcessingConsumer.run(SimpleMessageListenerContainer.java:1043)
    at java.lang.Thread.run(Thread.java:748)
 发送一条消息以测试confirm回调。。。。
java.lang.ArithmeticException: / by zero
    at cn.dzz.rabbitmq.listener.AcknowledgeListener.onMessage(AcknowledgeListener.java:40)
    at org.springframework.amqp.rabbit.listener.adapter.MessageListenerAdapter.onMessage(MessageListenerAdapter.java:272)
    at org.springframework.amqp.rabbit.listener.AbstractMessageListenerContainer.doInvokeListener(AbstractMessageListenerContainer.java:1542)
    at org.springframework.amqp.rabbit.listener.AbstractMessageListenerContainer.actualInvokeListener(AbstractMessageListenerContainer.java:1468)
    at org.springframework.amqp.rabbit.listener.AbstractMessageListenerContainer.invokeListener(AbstractMessageListenerContainer.java:1456)
    at org.springframework.amqp.rabbit.listener.AbstractMessageListenerContainer.doExecuteListener(AbstractMessageListenerContainer.java:1451)
    at org.springframework.amqp.rabbit.listener.AbstractMessageListenerContainer.executeListener(AbstractMessageListenerContainer.java:1400)
    at org.springframework.amqp.rabbit.listener.SimpleMessageListenerContainer.doReceiveAndExecute(SimpleMessageListenerContainer.java:870)
    at org.springframework.amqp.rabbit.listener.SimpleMessageListenerContainer.receiveAndExecute(SimpleMessageListenerContainer.java:854)
    at org.springframework.amqp.rabbit.listener.SimpleMessageListenerContainer.access$1600(SimpleMessageListenerContainer.java:78)
    at org.springframework.amqp.rabbit.listener.SimpleMessageListenerContainer$AsyncMessageProcessingConsumer.mainLoop(SimpleMessageListenerContainer.java:1137)
    at org.springframework.amqp.rabbit.listener.SimpleMessageListenerContainer$AsyncMessageProcessingConsumer.run(SimpleMessageListenerContainer.java:1043)
    at java.lang.Thread.run(Thread.java:748)
 发送一条消息以测试confirm回调。。。。
原文地址:https://www.cnblogs.com/mindzone/p/15376328.html