RabbitMQ 队列的第一条消息导致通道关闭

问题描述 投票:0回答:4

我队列的第一条消息总是失败。 从第二个开始,一切正常!

不确定那是否可读所以:

Created new connection: rabbitConnectionFactory#1b940034:0/SimpleConnection@2c52fbff [delegate=amqp://[email protected]:5672/, localPort= 36370]

Channel shutdown: channel error; protocol method: #method<channel.close>(reply-code=406, reply-text=PRECONDITION_FAILED - inequivalent arg 'auto_delete' for exchange 'rabbitmq_exchange' in vhost '/': received 'false' but current is 'true', class-id=40, method-id=10)

我不确定为什么会这样,因为我每次都在新的 VM(AWS EC2 实例)上启动它。 “电流”怎么可能是真的?

我想在 Spring Boot 发布者中配置不当:

不确定那是否可读所以:

@Configuration
public class RabbitMqConfig {
    @Bean
    Queue queue() {
        return new Queue(System.getenv("RABBITMQ_QUEUE_NAME"), true,false, false);
    }

    @Bean
    DirectExchange exchange() {
        return new DirectExchange(System.getenv("RABBITMQ_EXCHANGE_NAME"), true, false);
    }

    @Bean
    Binding binding(Queue queue, DirectExchange exchange) {
        return BindingBuilder.bind(queue).to(exchange).with(System.getenv("RABBITMQ_ROUTING_KEY"));
    }

    @Bean
    public MessageConverter jsonMessageConverter(){
        return new Jackson2JsonMessageConverter();
    }

    public AmqpTemplate rabbitTemplate(ConnectionFactory connectionFactory) {
        final RabbitTemplate rabbitTemplate = new RabbitTemplate(connectionFactory);
        rabbitTemplate.setMessageConverter(jsonMessageConverter());
        return rabbitTemplate;
    }
}

那么这里出了什么问题? 谢谢!

rabbitmq spring-rabbit
4个回答
7
投票

错误很明显...

频道关闭:频道错误;协议方法:#method(reply-code=406, reply-text=PRECONDITION_FAILED - 不等价的 arg 'auto_delete' for exchange 'rabbitmq_exchange' in vhost '/': received 'false' but current is 'true', class-id=40 , 方法-id=10)

首次打开连接时,框架会查找队列/绑定等并声明它们。如果队列已经存在,它必须具有相同的属性/参数。

@Bean
Queue queue() {
    return new Queue(System.getenv("RABBITMQ_QUEUE_NAME"), true, false, false);
}

据推测,在消费者方面,它被声明为具有不同的属性......

@Bean
Queue queue() {
    return new Queue(System.getenv("RABBITMQ_QUEUE_NAME"), true, false, true);
}

(auto_delete 是不等价的)。

它们必须相同。


1
投票

定义一个队列如下。

declare queue name=YourQueName durable=false --vhost="YourVirtualHostName" -u UsernameOfYourQueue -p PasswordOfYourQueue

1
投票

在我的例子中,队列最初是用错误的配置创建的,所以每次我重新启动我的应用程序时都会显示这个错误。 删除队列并让应用程序使用新配置重新创建它,解决了这个问题。


0
投票

就我而言,我并没有完全收到这条消息,但是每次我尝试发送消息时端口都会关闭。我能够找到虚拟主机的问题,我没有指向该帐户具有权限的正确 VHost。

将此条目添加到

application.properties
解决了这个问题。

spring.rabbitmq.virtual-host=<correct-vhost>

© www.soinside.com 2019 - 2024. All rights reserved.