我队列的第一条消息总是失败。 从第二个开始,一切正常!
不确定那是否可读所以:
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;
}
}
那么这里出了什么问题? 谢谢!
错误很明显...
频道关闭:频道错误;协议方法:#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 是不等价的)。
它们必须相同。
定义一个队列如下。
declare queue name=YourQueName durable=false --vhost="YourVirtualHostName" -u UsernameOfYourQueue -p PasswordOfYourQueue
在我的例子中,队列最初是用错误的配置创建的,所以每次我重新启动我的应用程序时都会显示这个错误。 删除队列并让应用程序使用新配置重新创建它,解决了这个问题。
就我而言,我并没有完全收到这条消息,但是每次我尝试发送消息时端口都会关闭。我能够找到虚拟主机的问题,我没有指向该帐户具有权限的正确 VHost。
将此条目添加到
application.properties
解决了这个问题。
spring.rabbitmq.virtual-host=<correct-vhost>