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

mwyxok5s  于 2023-04-11  发布在  RabbitMQ
关注(0)|答案(4)|浏览(310)

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

我不确定这是否是可读的,所以:

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)

我不知道为什么会发生这种情况,因为我每次都是在一个新的虚拟机(AWS EC2示例)上启动它。
我认为Sping 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;
    }
}

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

ogsagwnx

ogsagwnx1#

错误是很明显的…
通道关闭:通道误差;方案方法:#method(reply-code=406,reply-text=PRECONDITION_FAILED - inequivalent arg 'auto_delete' for exchange 'rabbitmq_exchange' in vhost '/':接收到“假”,但当前为“真”,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);
}

(the auto_delete是不等价的)。
它们必须是相同的。

t1rydlwq

t1rydlwq2#

如下定义队列。

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

oyxsuwqo3#

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

wmtdaxz3

wmtdaxz34#

在我的情况下,我没有完全得到这个消息,然而端口被关闭每次我尝试发送消息.我能够找到问题的虚拟主机,我没有指向正确的VHost帐户有权限.
将此条目添加到application.properties修复了该问题。
spring.rabbitmq.virtual-host=<correct-vhost>

相关问题