zoukankan      html  css  js  c++  java
  • Caused by: com.rabbitmq.client.ShutdownSignalException: channel error; protocol method: #method<channel.close>(reply-code=406, reply-text=PRECONDITION_FAILED

    在启动RabbitMQ消费端的时候报错:Caused by: com.rabbitmq.client.ShutdownSignalException: channel error; protocol method: #method<channel.close>(reply-code=406, reply-text=PRECONDITION_FAILED - inequivalent arg 'type' for exchange 'messageChange' in vhost '/': received 'fanout' but current is 'direct', class-id=40, method-id=10)

     详细信息如下:

     1 F:jdk1.8.0_151injava.exe "-javaagent:E:IntelliJ IDEA 2019.2.1libidea_rt.jar=56252:E:IntelliJ IDEA 2019.2.1in" -Dfile.encoding=UTF-8 -classpath F:jdk1.8.0_151jrelibcharsets.jar;F:jdk1.8.0_151jrelibdeploy.jar;F:jdk1.8.0_151jrelibextaccess-bridge-64.jar;F:jdk1.8.0_151jrelibextcldrdata.jar;F:jdk1.8.0_151jrelibextdnsns.jar;F:jdk1.8.0_151jrelibextjaccess.jar;F:jdk1.8.0_151jrelibextjfxrt.jar;F:jdk1.8.0_151jrelibextlocaledata.jar;F:jdk1.8.0_151jrelibext
    ashorn.jar;F:jdk1.8.0_151jrelibextsunec.jar;F:jdk1.8.0_151jrelibextsunjce_provider.jar;F:jdk1.8.0_151jrelibextsunmscapi.jar;F:jdk1.8.0_151jrelibextsunpkcs11.jar;F:jdk1.8.0_151jrelibextzipfs.jar;F:jdk1.8.0_151jrelibjavaws.jar;F:jdk1.8.0_151jrelibjce.jar;F:jdk1.8.0_151jrelibjfr.jar;F:jdk1.8.0_151jrelibjfxswt.jar;F:jdk1.8.0_151jrelibjsse.jar;F:jdk1.8.0_151jrelibmanagement-agent.jar;F:jdk1.8.0_151jrelibplugin.jar;F:jdk1.8.0_151jrelib
    esources.jar;F:jdk1.8.0_151jrelib
    t.jar;F:workspace
    abbitmqDemo
    abbitmqConsumer02	arget	est-classes;F:
    epository_sshorgspringframeworkootspring-boot-starter-logging2.1.0.RELEASEspring-boot-starter-logging-2.1.0.RELEASE.jar;F:
    epository_sshchqoslogbacklogback-classic1.2.3logback-classic-1.2.3.jar;F:
    epository_sshchqoslogbacklogback-core1.2.3logback-core-1.2.3.jar;F:
    epository_sshorgapachelogginglog4jlog4j-to-slf4j2.11.1log4j-to-slf4j-2.11.1.jar;F:
    epository_sshorgapachelogginglog4jlog4j-api2.11.1log4j-api-2.11.1.jar;F:
    epository_sshorgslf4jjul-to-slf4j1.7.25jul-to-slf4j-1.7.25.jar;F:
    epository_sshcom
    abbitmqamqp-client5.7.0amqp-client-5.7.0.jar;F:
    epository_sshorgslf4jslf4j-api1.7.26slf4j-api-1.7.26.jar xyfer.Consumer01
     2 java.io.IOException
     3     at com.rabbitmq.client.impl.AMQChannel.wrap(AMQChannel.java:129)
     4     at com.rabbitmq.client.impl.AMQChannel.wrap(AMQChannel.java:125)
     5     at com.rabbitmq.client.impl.AMQChannel.exnWrappingRpc(AMQChannel.java:147)
     6     at com.rabbitmq.client.impl.ChannelN.exchangeDeclare(ChannelN.java:783)
     7     at com.rabbitmq.client.impl.recovery.AutorecoveringChannel.exchangeDeclare(AutorecoveringChannel.java:242)
     8     at com.rabbitmq.client.impl.recovery.AutorecoveringChannel.exchangeDeclare(AutorecoveringChannel.java:232)
     9     at com.rabbitmq.client.impl.recovery.AutorecoveringChannel.exchangeDeclare(AutorecoveringChannel.java:212)
    10     at com.rabbitmq.client.impl.recovery.AutorecoveringChannel.exchangeDeclare(AutorecoveringChannel.java:217)
    11     at xyfer.Consumer01.main(Consumer01.java:30)
    12 Caused by: com.rabbitmq.client.ShutdownSignalException: channel error; protocol method: #method<channel.close>(reply-code=406, reply-text=PRECONDITION_FAILED - inequivalent arg 'type' for exchange 'messageChange' in vhost '/': received 'fanout' but current is 'direct', class-id=40, method-id=10)
    13     at com.rabbitmq.utility.ValueOrException.getValue(ValueOrException.java:66)
    14     at com.rabbitmq.utility.BlockingValueOrException.uninterruptibleGetValue(BlockingValueOrException.java:36)
    15     at com.rabbitmq.client.impl.AMQChannel$BlockingRpcContinuation.getReply(AMQChannel.java:502)
    16     at com.rabbitmq.client.impl.AMQChannel.privateRpc(AMQChannel.java:293)
    17     at com.rabbitmq.client.impl.AMQChannel.exnWrappingRpc(AMQChannel.java:141)
    18     ... 6 more
    19 Caused by: com.rabbitmq.client.ShutdownSignalException: channel error; protocol method: #method<channel.close>(reply-code=406, reply-text=PRECONDITION_FAILED - inequivalent arg 'type' for exchange 'messageChange' in vhost '/': received 'fanout' but current is 'direct', class-id=40, method-id=10)
    20     at com.rabbitmq.client.impl.ChannelN.asyncShutdown(ChannelN.java:522)
    21     at com.rabbitmq.client.impl.ChannelN.processAsync(ChannelN.java:346)
    22     at com.rabbitmq.client.impl.AMQChannel.handleCompleteInboundCommand(AMQChannel.java:182)
    23     at com.rabbitmq.client.impl.AMQChannel.handleFrame(AMQChannel.java:114)
    24     at com.rabbitmq.client.impl.AMQConnection.readFrame(AMQConnection.java:672)
    25     at com.rabbitmq.client.impl.AMQConnection.access$300(AMQConnection.java:48)
    26     at com.rabbitmq.client.impl.AMQConnection$MainLoop.run(AMQConnection.java:599)
    27     at java.lang.Thread.run(Thread.java:748)
    28 
    29 Process finished with exit code -1

    仔细看一下报错信息:Caused by: com.rabbitmq.client.ShutdownSignalException: channel error; protocol method: #method<channel.close>(reply-code=406, reply-text=PRECONDITION_FAILED - inequivalent arg 'type' for exchange 'messageChange' in vhost '/': received 'fanout' but current is 'direct', class-id=40, method-id=10)

    大概意思是交换机的类型不匹配,消费端应该收到名称为“messageChange”,类型为“fanout”的交换机发送的消息,但是当前RabbitMQ中存在的名称为“messageChange”的交换机的类型却是“direct”,所以交换机的类型不匹配。

    打开RabbitMQ可以看到确实是这样:

    目前有两种解决方式:

    一、更改消费端代码中声明的交换机名称即可;

    二,把RabbitMQ中的同名却不同类型的交换机删除即可;

    消费端代码如下,交换机名称为“messageChange”,类型为“fanout”;

    package xyfer;
    
    import com.rabbitmq.client.*;
    
    import java.io.IOException;
    import java.util.concurrent.TimeoutException;
    
    public class Consumer02 {
        //Publish/subscribe发布订阅模式
        private static final String QUEUE_SMS ="queueSms";
        private static final String EXCHANGE = "messageChange";   同名
        public static void main(String[] args) {
            Connection connection = null;
            Channel channel = null;
            try {
                ConnectionFactory connectionFactory = new ConnectionFactory();
                connectionFactory.setHost("127.0.0.1");
                connectionFactory.setPort(5672);
                connection = connectionFactory.newConnection();
                channel = connection.createChannel();
                //通道绑定交换机
                /**
                  * 参数明细
                  * 1、交换机名称
                  * 2、交换机类型,fanout、topic、direct、headers
                  */
                //Publish/subscribe发布订阅模式
                channel.exchangeDeclare(EXCHANGE, BuiltinExchangeType.FANOUT);   不同类型
                //通道绑定队列
                /**
                 * 声明队列,如果Rabbit中没有此队列将自动创建
                 * param1:队列名称
                 * param2:是否持久化
                 * param3:队列是否独占此连接
                 * param4:队列不再使用时是否自动删除此队列
                 * param5:队列参数
                 * String queue, boolean durable, boolean exclusive, boolean autoDelete, Map<String, Object> arguments
                 *
                 */
                channel.queueDeclare(QUEUE_SMS,true,false,false,null);//通道绑定短信队列
                //交换机和队列绑定
                /**
                 * 参数明细
                 * 1、队列名称
                 * 2、交换机名称
                 * 3、路由key
                 */
                //Publish/subscribe发布订阅模式
                channel.queueBind(QUEUE_SMS,EXCHANGE,"");
                DefaultConsumer consumer = new DefaultConsumer(channel) {
                    /**
                      * 消费者接收消息调用此方法
                      * @param consumerTag 消费者的标签,在channel.basicConsume()去指定
                      * @param envelope 消息包的内容,可从中获取消息id,消息routingkey,交换机,消息和重传标志
                        (收到消息失败后是否需要重新发送)
                      * @param properties
                      * @param body
                      * @throws IOException
                     * String consumerTag, Envelope envelope, BasicProperties properties, byte[] body
                     */
                    @Override
                    public void handleDelivery(String consumerTag, Envelope envelope, AMQP.BasicProperties properties, byte[] body) throws IOException {
                        //交换机
                        String exchange = envelope.getExchange();
                        //路由key
                        String routingKey = envelope.getRoutingKey();
                        envelope.getDeliveryTag();
                        String msg = new String(body,"utf-8");
                        System.out.println("mq收到的消息是:"+msg );
                    }
    
                };
                System.out.println("消费者启动成功!");
                channel.basicConsume(QUEUE_SMS,true,consumer);
    
            } catch (IOException e) {
                e.printStackTrace();
            } catch (TimeoutException e) {
                e.printStackTrace();
            }
        }
    }
  • 相关阅读:
    Graphics—对话框操作
    Visual Studio 2013 出现error C4996(fopen函数出错)如何解决
    Visual Studio 2013出现错误LNK 2026(SAFESEH模块不兼容)如何解决
    Graphics—菜单设置笔记
    kali 根目录中文乱码
    sqlite文件损坏修复
    win10,mysql安装
    flask 对从数据库反向生成的表进行修改
    flask第一章:项目环境搭建
    flask 连接数据各种报错
  • 原文地址:https://www.cnblogs.com/xyfer1018/p/11582814.html
Copyright © 2011-2022 走看看