Spring Boot 1.5.15
当我声明一个队列时,该队列即被声明并且发送/接收工作正常。 如果我添加第二个(和后续)队列,则会记录错误,重新声明队列5次,最后应用程序无法启动。
Spring Boot RabbitMQ配置:
@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)
如果注释了一个队列声明,则日志显示仅声明了一个队列,并且应用程序继续启动(也就是说,其他地方未声明另一个队列)
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)
答案 0 :(得分:1)
好吧,那真是个愚蠢的家伙(很可能是这样)。
我假设每次声明队列都是从头开始创建的,这与我的配置不同。
实际上,它存在一个不同的耐用性参数-正是msg试图告诉我的错误。
解决方案:我使用AmqAdmin.deleteQueue()