【问题标题】:Channel shutdown: channel error频道关闭:频道错误
【发布时间】:2016-01-04 12:38:04
【问题描述】:

有时我会在我的日志文件中找到以下条目。我不知道问题是什么。我的猜测是设置较低的请求心跳。还有其他想法吗? 此外,我遇到的情况是,在兔子重新启动后,我的服务器无法在兔子回来后重新建立服务。我必须重新启动服务器,才能重新连接。

[AMQP Connection xxx:5672] [ERROR] org.springframework.amqp.rabbit.connection.CachingConnectionFactory - Channel shutdown: channel error; protocol method: #method<channel.close>(reply-code=404, reply-text=NOT_FOUND - no exchange 'xxxx' in vhost 'aaa', class-id=60, method-id=40)

交换和队列不是自动删除的吗?

公共类 AmqpConfiguration {

@Autowired
private ConnectionFactory connectionFactory;  

@Bean
public Queue receiverQueue() {
    return new Queue("receiverQueue", true, false, false, getDeadLetterExchangeArgs());
}

@Bean
public FanoutExchange senderExchange() {
    return new FanoutExchange("xxxx");
}

@Bean
public Queue deadLetterQueue() {
    return new Queue("deadLetterQueue");
}

@Bean
public FanoutExchange exchangeDeadLetter() {
    return new FanoutExchange("deadLetter.exchange");
}


@Bean
public Binding bindDeadLetterQueueToExchange() {
    return BindingBuilder.bind(deadLetterQueue()).to(exchangeDeadLetter());
}


@Bean
public Binding bindSenderExchangeToQueue() {
    return BindingBuilder.bind(receiverQueue()).to(senderExchange());
}

@Bean(name = { "listenerContainerFactory" })
public SimpleRabbitListenerContainerFactory listenerContainerFactory() {
    final SimpleRabbitListenerContainerFactory containerFactory = new SimpleRabbitListenerContainerFactory();
    containerFactory.setDefaultRequeueRejected(false);
    containerFactory.setConnectionFactory(connectionFactory);

    // TODO: set heartbeat

    return containerFactory;
}

private Map<String, Object> getDeadLetterExchangeArgs() {
    final Map<String, Object> args = new HashMap<String, Object>();
    args.put("x-dead-letter-exchange", amqpProperties.getDeadLetterExchange());
    return args;
}

}

干杯,

丹尼斯

【问题讨论】:

  • 您需要显示您的配置 - 交换会自动删除吗?如果是这样,你用什么在broker上声明交易所?
  • 感谢您的快速回复,请参阅原始帖子中的 cmets

标签: spring rabbitmq amqp spring-rabbit


【解决方案1】:

在 vhost 'aaa' 中没有交换 'xxxx'

在您显示的配置中,我没有看到交换 xxxx

也许你有一些伪造的代码发送到那个交易所?

编辑

如果它是一个启动应用程序,并且您使用的是 amqp 启动器,那么 rabbit 自动配置将为您创建一个管理员。重新启动服务器后,您应该会看到类似这样的消息(如果您启用了 DEBUG 日志记录)...

09:43:03.450 [SimpleAsyncTaskExecutor-9] INFO  o.s.a.r.c.CachingConnectionFactory - Created new connection: SimpleConnection@b6e2e2c [delegate=amqp://guest@127.0.0.1:5672/]
09:43:03.451 [SimpleAsyncTaskExecutor-9] DEBUG o.s.amqp.rabbit.core.RabbitAdmin - Initializing declarations
09:43:03.451 [SimpleAsyncTaskExecutor-9] DEBUG o.s.b.f.s.DefaultListableBeanFactory - Returning cached instance of singleton bean 'senderExchange'
09:43:03.451 [SimpleAsyncTaskExecutor-9] DEBUG o.s.b.f.s.DefaultListableBeanFactory - Returning cached instance of singleton bean 'receiverQueue'
09:43:03.451 [SimpleAsyncTaskExecutor-9] DEBUG o.s.b.f.s.DefaultListableBeanFactory - Returning cached instance of singleton bean 'bindSenderExchangeToQueue'
09:43:03.451 [SimpleAsyncTaskExecutor-9] DEBUG o.s.b.f.s.DefaultListableBeanFactory - Returning cached instance of singleton bean 'org.springframework.context.annotation.ConfigurationClassPostProcessor.importRegistry'
09:43:03.452 [SimpleAsyncTaskExecutor-9] DEBUG o.s.a.r.c.CachingConnectionFactory - Creating cached Rabbit Channel from AMQChannel(amqp://guest@127.0.0.1:5672/,1)
09:43:03.452 [SimpleAsyncTaskExecutor-9] DEBUG o.s.amqp.rabbit.core.RabbitTemplate - Executing callback on RabbitMQ Channel: Cached Rabbit Channel: AMQChannel(amqp://guest@127.0.0.1:5672/,1)
09:43:03.452 [SimpleAsyncTaskExecutor-9] DEBUG o.s.amqp.rabbit.core.RabbitAdmin - declaring Exchange 'xxxx'
09:43:03.452 [SimpleAsyncTaskExecutor-9] DEBUG o.s.amqp.rabbit.core.RabbitAdmin - declaring Queue 'receiverQueue'
09:43:03.453 [SimpleAsyncTaskExecutor-9] DEBUG o.s.amqp.rabbit.core.RabbitAdmin - Binding destination [receiverQueue (QUEUE)] to exchange [xxxx] with routing key []
09:43:03.453 [SimpleAsyncTaskExecutor-9] DEBUG o.s.amqp.rabbit.core.RabbitAdmin - Declarations finished

管理员注册为连接工厂的侦听器,并始终在建立连接时声明队列/交换/绑定。

您有多个连接工厂/虚拟主机吗?如果是这样,您需要为每个管理员设置一个管理员 - 请参阅 section on conditional declaration

【讨论】:

  • 我认为exchange是FanoutExchange中的原始错误代码是xxxxxx一个ip地址。没有交换'xxx.xx.x.xxx'。我扩展了配置。
  • 如何声明这些实体(交易所等)?我在您的配置中没有看到RabbitAdmin,它会在创建连接时自动声明它们。如果您自己声明它们,则可能存在竞争条件。
  • 这是一个类似spring.io/guides/gs/messaging-rabbitmq的Spring Boot应用程序。 queue() 方法创建一个 AMQP 队列。 exchange() 方法创建一个扇出交换。 binding() 方法将这两者绑定在一起,定义了 RabbitTemplate 发布到交换器时发生的行为。那么我需要 RabbitAdmin 做什么?配置工作直到rabbit mq重新启动,然后队列无法重新连接。也许这是一个rabbit-mq集群问题,之后队列将移动到另一个节点。
  • 交换存在于所有节点上,所以这不是问题;你有多个虚拟主机吗?有关 RabbitAdmin 的信息,请参阅我的编辑。
  • 抱歉,Gary 回复晚了。
猜你喜欢
  • 2015-05-17
  • 2016-12-26
  • 1970-01-01
  • 1970-01-01
  • 2020-04-26
  • 2015-01-25
  • 2013-12-28
  • 2013-09-02
  • 1970-01-01
相关资源
最近更新 更多