此处由于代码和管理页面设置的交换机参数不一致导致errorcode=406
第一次发布时在管理端创建了错误参数的交换机,后续代码报错code=406,发现错误日志后通过管理端删除了错误的交换机并创建了正确的交换机。但是代码依然报错406。由于生产环境不便于重启,一直使用的是错误的channel实例即使创建了正确的交换机代码运行依然报错!
原来日志已经一直在明确的告诉我了channel is already closed due to channel error,我却一直忽略了,以为虽然本次执行报错channel关闭但是他每次执行exchangeDeclare()方法时都会重新恢复channel;但是试验表名并非如此。。
我们创建的channel对象会继承ShutdownNotifierComponent类,该类中有一个ShutdownSignalException shutdownCause属性,一旦该属性有值后后续所有的exchangeDeclare操作都会报错且打印已有的shutdownCause,并不会去与mq交互;截图如下:
感觉该问题有点反直觉,记录一下 ~~~
GIthub关联的Discussions
测试代码如下:amqp-client版本为5.20.0
import com.rabbitmq.client.BuiltinExchangeType;
import com.rabbitmq.client.Channel;
import com.rabbitmq.client.Connection;
import com.rabbitmq.client.ConnectionFactory;
import lombok.extern.slf4j.Slf4j;
@Slf4j
public class MQTest {
public static void main(String[] args) {
try {
ConnectionFactory connectionFactory = new ConnectionFactory();
connectionFactory.setHost("192.168.1.1");
connectionFactory.setPort(5672);
connectionFactory.setUsername("admin");
connectionFactory.setPassword("admin");
Channel channel = connectionFactory.newConnection().createChannel();
while (true) {
log.info("create exchange");
try {
channel.exchangeDeclare("ysl.test.direct", BuiltinExchangeType.DIRECT,
false, false, null);
}catch (Exception e){
log.error("create exchange error",e);
}
Thread.sleep(5000);
}
}catch (Exception e){
log.error("error",e);
}
}
}