1. 程式人生 > 實用技巧 >Caused by: com.rabbitmq.client.ShutdownSignalException: channel error; protocol method: ......

Caused by: com.rabbitmq.client.ShutdownSignalException: channel error; protocol method: ......

在啟動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)

F:\jdk1.8.0_151\bin\java.exe "-javaagent:E:\IntelliJ IDEA 2019.2.1\lib\idea_rt.jar=58077: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.Consumer02
java.io.IOException
    at com.rabbitmq.client.impl.AMQChannel.wrap(AMQChannel.java:
129) at com.rabbitmq.client.impl.AMQChannel.wrap(AMQChannel.java:125) at com.rabbitmq.client.impl.AMQChannel.exnWrappingRpc(AMQChannel.java:147) at com.rabbitmq.client.impl.ChannelN.exchangeDeclare(ChannelN.java:783) at com.rabbitmq.client.impl.recovery.AutorecoveringChannel.exchangeDeclare(AutorecoveringChannel.java:
242) at com.rabbitmq.client.impl.recovery.AutorecoveringChannel.exchangeDeclare(AutorecoveringChannel.java:232) at com.rabbitmq.client.impl.recovery.AutorecoveringChannel.exchangeDeclare(AutorecoveringChannel.java:212) at com.rabbitmq.client.impl.recovery.AutorecoveringChannel.exchangeDeclare(AutorecoveringChannel.java:217) at xyfer.Consumer02.main(Consumer02.java:28) 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) at com.rabbitmq.utility.ValueOrException.getValue(ValueOrException.java:66) at com.rabbitmq.utility.BlockingValueOrException.uninterruptibleGetValue(BlockingValueOrException.java:36) at com.rabbitmq.client.impl.AMQChannel$BlockingRpcContinuation.getReply(AMQChannel.java:502) at com.rabbitmq.client.impl.AMQChannel.privateRpc(AMQChannel.java:293) at com.rabbitmq.client.impl.AMQChannel.exnWrappingRpc(AMQChannel.java:141) ... 6 more 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) at com.rabbitmq.client.impl.ChannelN.asyncShutdown(ChannelN.java:522) at com.rabbitmq.client.impl.ChannelN.processAsync(ChannelN.java:346) at com.rabbitmq.client.impl.AMQChannel.handleCompleteInboundCommand(AMQChannel.java:182) at com.rabbitmq.client.impl.AMQChannel.handleFrame(AMQChannel.java:114) at com.rabbitmq.client.impl.AMQConnection.readFrame(AMQConnection.java:672) at com.rabbitmq.client.impl.AMQConnection.access$300(AMQConnection.java:48) at com.rabbitmq.client.impl.AMQConnection$MainLoop.run(AMQConnection.java:599) at java.lang.Thread.run(Thread.java:748)

仔細看一下報錯資訊: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中的同名卻不同型別的交換機刪除即可;(測試環境下)