Caused by: com.rabbitmq.client.ShutdownSignalException: channel error; protocol method: #method (reply-code=406, reply-text=PRECONDITION_FAILED - inequivalent arg 'type' for exchange 'me


在啟動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_151\bin\java.exe "-javaagent:E:\IntelliJ IDEA 2019.2.1\lib\idea_rt.jar=56252:E:\IntelliJ IDEA 2019.2.1\bin" -Dfile.encoding=UTF-8 -classpath F:\jdk1.8.0_151\jre\lib\charsets.jar;F:\jdk1.8.0_151\jre\lib\deploy.jar;F:\jdk1.8.0_151\jre\lib\ext\access-bridge-64.jar;F:\jdk1.8.0_151\jre\lib\ext\cldrdata.jar;F:\jdk1.8.0_151\jre\lib\ext\dnsns.jar;F:\jdk1.8.0_151\jre\lib\ext\jaccess.jar;F:\jdk1.8.0_151\jre\lib\ext\jfxrt.jar;F:\jdk1.8.0_151\jre\lib\ext\localedata.jar;F:\jdk1.8.0_151\jre\lib\ext\nashorn.jar;F:\jdk1.8.0_151\jre\lib\ext\sunec.jar;F:\jdk1.8.0_151\jre\lib\ext\sunjce_provider.jar;F:\jdk1.8.0_151\jre\lib\ext\sunmscapi.jar;F:\jdk1.8.0_151\jre\lib\ext\sunpkcs11.jar;F:\jdk1.8.0_151\jre\lib\ext\zipfs.jar;F:\jdk1.8.0_151\jre\lib\javaws.jar;F:\jdk1.8.0_151\jre\lib\jce.jar;F:\jdk1.8.0_151\jre\lib\jfr.jar;F:\jdk1.8.0_151\jre\lib\jfxswt.jar;F:\jdk1.8.0_151\jre\lib\jsse.jar;F:\jdk1.8.0_151\jre\lib\management-agent.jar;F:\jdk1.8.0_151\jre\lib\plugin.jar;F:\jdk1.8.0_151\jre\lib\resources.jar;F:\jdk1.8.0_151\jre\lib\rt.jar;F:\workspace\rabbitmqDemo\rabbitmqConsumer02\target\test-classes;F:\repository_ssh\org\springframework\boot\spring-boot-starter-logging\2.1.0.RELEASE\spring-boot-starter-logging-2.1.0.RELEASE.jar;F:\repository_ssh\ch\qos\logback\logback-classic\1.2.3\logback-classic-1.2.3.jar;F:\repository_ssh\ch\qos\logback\logback-core\1.2.3\logback-core-1.2.3.jar;F:\repository_ssh\org\apache\logging\log4j\log4j-to-slf4j\2.11.1\log4j-to-slf4j-2.11.1.jar;F:\repository_ssh\org\apache\logging\log4j\log4j-api\2.11.1\log4j-api-2.11.1.jar;F:\repository_ssh\org\slf4j\jul-to-slf4j\1.7.25\jul-to-slf4j-1.7.25.jar;F:\repository_ssh\com\rabbitmq\amqp-client\5.7.0\amqp-client-5.7.0.jar;F:\repository_ssh\org\slf4j\slf4j-api\1.7.26\slf4j-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();
        }
    }
}

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM