zoukankan      html  css  js  c++  java
  • 【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回调。。。。
  • 相关阅读:
    Microsoft .NET Framework v4.0 正确安装方法
    彻底解决C#实现DataTable导出EXCEL表格
    利用log4net记录操作日志
    [转]驱动程序开发—编译正传(5)
    [转]驱动程序开发-概述(1)
    论富客户端程序的webservice实现
    在Vista中编程控制防火墙设定(C#)
    [转]驱动程序开发—编译前传(4)
    C#系统较时
    [转]驱动程序开发—工具篇(2)
  • 原文地址:https://www.cnblogs.com/mindzone/p/15376328.html
Copyright © 2011-2022 走看看