Spring boot 使用默认exchange声明第二个队列会产生错误
弹簧靴1.5.15 当我声明一个队列时,该队列被声明,发送/接收工作正常。 如果我添加第二个和后续队列,则会记录一个错误,队列会被重新声明5次,最后应用程序无法启动 Spring引导RabbitMQ配置:Spring boot 使用默认exchange声明第二个队列会产生错误,spring-boot,rabbitmq,spring-amqp,Spring Boot,Rabbitmq,Spring Amqp,弹簧靴1.5.15 当我声明一个队列时,该队列被声明,发送/接收工作正常。 如果我添加第二个和后续队列,则会记录一个错误,队列会被重新声明5次,最后应用程序无法启动 Spring引导RabbitMQ配置: @Configuration public class RabbitConfig implements RabbitListenerConfigurer { @Autowired private ObjectMapper mapper;
@Configuration
public class RabbitConfig implements RabbitListenerConfigurer {
@Autowired
private ObjectMapper mapper;
@Bean
Queue crmAppealQueue(@Value("${app.queues.portalAppeal}") String queueName) {
return new Queue(queueName, false);
}
@Bean
Queue portalUserQueue(@Value("${app.queues.portalUser}") String queueName) {
return new Queue(queueName, false);
}
@Override
public void configureRabbitListeners(RabbitListenerEndpointRegistrar registrar) {
registrar.setMessageHandlerMethodFactory(messageHandlerMethodFactory());
}
@Bean
MessageHandlerMethodFactory messageHandlerMethodFactory() {
DefaultMessageHandlerMethodFactory messageHandlerMethodFactory = new DefaultMessageHandlerMethodFactory();
messageHandlerMethodFactory.setMessageConverter(consumerJackson2MessageConverter());
return messageHandlerMethodFactory;
}
@Bean
public MappingJackson2MessageConverter consumerJackson2MessageConverter() {
return new MappingJackson2MessageConverter();
}
@Bean
public RabbitTemplate rabbitTemplate(final ConnectionFactory connectionFactory) {
final RabbitTemplate rabbitTemplate = new RabbitTemplate(connectionFactory);
rabbitTemplate.setMessageConverter(producerJackson2MessageConverter());
return rabbitTemplate;
}
@Bean
public Jackson2JsonMessageConverter producerJackson2MessageConverter() {
return new Jackson2JsonMessageConverter(mapper);
}
}
有错误的日志:
2018-29-08 15:04:52,075 INFO (RabbitAdmin.java:566) - Auto-declaring a non-durable, auto-delete, or exclusive Queue (portal.appeal) durable:false, auto-delete:false, exclusive:false. It will be redeclared if the broker stops and is restarted while the connection factory is alive, but all messages will be lost.
2018-29-08 15:04:52,075 INFO (RabbitAdmin.java:566) - Auto-declaring a non-durable, auto-delete, or exclusive Queue (portal.user) durable:false, auto-delete:false, exclusive:false. It will be redeclared if the broker stops and is restarted while the connection factory is alive, but all messages will be lost.
2018-29-08 15:04:52,122 ERROR (CachingConnectionFactory.java:1327) - Channel shutdown: channel error; protocol method: #method<channel.close>(reply-code=406, reply-text=PRECONDITION_FAILED - inequivalent arg 'durable' for queue 'portal.user' in vhost '/': received 'false' but current is 'true', class-id=50, method-id=10)
好吧,这是一个愚蠢的想法 我假设每次声明队列时都会从头创建一个队列,但在我的配置中,情况并非如此 事实上,它已经存在了一个不同的耐久性参数-这正是错误消息试图告诉我的
解决方案:我使用AmqAdmin.deleteQueue将其删除portal.user队列已经存在,其设置与您在此处配置的不同,这就是错误消息告诉您的内容。您不能重新声明队列。同意,这是log msg的建议,但我仔细检查了它以确保情况并非如此。更新问题
2018-29-08 17:21:49,435 INFO (AbstractConnectionFactory.java:379) - Created new connection: rabbitConnectionFactory#74ba4614:0/SimpleConnection@2a6c087d [delegate=amqp://precrm@192.168.82.177:5672/, localPort= 63501]
2018-29-08 17:21:49,435 INFO (RabbitAdmin.java:566) - Auto-declaring a non-durable, auto-delete, or exclusive Queue (portal.appeal) durable:false, auto-delete:false, exclusive:false. It will be redeclared if the broker stops and is restarted while the connection factory is alive, but all messages will be lost.
2018-29-08 17:21:49,529 INFO (StartupInfoLogger.java:57) - Started PortalAppealMessageHandlerTest in 5.317 seconds (JVM running for 6.599)