我创建了一个带有消息过期args的队列,但是在启动服务器时出现以下错误。
[SimpleAsyncTaskExecutor-1] o.s.a.r.c.RabbitAdmin [RabbitAdmin.java:375] Auto-declaring a non-durable Queue (TEST_QUEUE). It will be redeclared if the broker stops and is restarted while the connection factory is alive, but all messages will be lost.
pool-1-thread-1] o.s.a.r.c.CachingConnectionFactory [CachingConnectionFactory.java:249] Channel shutdown: channel error; protocol method: #method<channel.close>(reply-code=406, reply-text=PRECONDITION_FAILED - inequivalent arg 'durable' for queue 'EXP_MSG' in vhost '/': received 'false' but current is 'true', class-id=50, method-id=10)
ERROR [SimpleAsyncTaskExecutor-1] o.s.a.r.l.SimpleMessageListenerContainer [SimpleMessageListenerContainer.java:914] Failed to check/redeclare auto-delete queue(s).
org.springframework.amqp.AmqpIOException: java.io.IOException
at org.springframework.amqp.rabbit.support.RabbitExceptionTranslator.convertRabbitAccessException(RabbitExceptionTranslator.java:63) ~[spring-rabbit-1.4.0.RELEASE.jar:na]
at org.springframework.amqp.rabbit.connection.RabbitAccessor.convertRabbitAccessException(RabbitAccessor.java:110) ~[spring-rabbit-1.4.0.RELEASE.jar:na]
我使用Spring boot 1.2.8和Spring 4.2.5版本。
@Bean
Queue expiredMessageQueue() {
Map args = new HashMap();
args.put("x-message-ttl", 60000);
return new Queue(expiredMessageQueue, false, false, false,args);
}
答案 0 :(得分:2)
不等价的arg&#39;耐用&#39;对于队列&#39; EXP_MSG&#39;在vhost&#39; /&#39;:收到&#39; false&#39;但目前是真的&#39;
这意味着RabbitMQ Broker上已经存在这样的队列,但具有不同的属性。
如果您想要更改它并通过应用程序重新创建,则应在开始应用程序之前首先从Broker中删除它。或者将所有选项与现有选项对齐。
这就像passiveDeclaration
一样。监听器确实需要一个真正的队列来订阅,并且只有为什么要检查它是否存在于所需状态,尝试在监听器启动期间声明它。