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

时间:2018-05-23 09:51:17

标签: rabbitmq spring-rabbitmq

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

Stacktrace

不确定这是否可读:

Created new connection: rabbitConnectionFactory#1b940034:0/SimpleConnection@2c52fbff [delegate=amqp://guest@10.0.0.10: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发布者中配置错误:

enter image description here

不确定这是否可读:

@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;
    }
}

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

3 个答案:

答案 0 :(得分:1)

错误很明显......

  

频道关闭:频道错误;协议方法:#method(reply-code = 406,reply-text = PRECONDITION_FAILED - 不相等的arg&#39; auto_delete&#39;用于交换&#39; rabbitmq_exchange&#39;在vhost&#39; /&#39;:收到&#39; false&#39;但是当前是&#39; true&#39;,class-id = 40,method-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 :(得分:0)

如下定义队列。

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

答案 2 :(得分:0)

对于我来说,该队列是首先使用错误的配置创建的,因此,每次我重新启动应用程序时,都会显示此错误。 使用新的配置删除队列并让应用程序重新创建它可以解决此问题。