RabbitMQ 报错
报错信息
2020-09-29 09:53:54 -Queue declaration failed; retries left=1
org.springframework.amqp.rabbit.listener.BlockingQueueConsumer$DeclarationException: Failed to declare queue(s):[data.device.treated]
....................
排查发现只监听了 data.device.treated 这个队列 却没在config 里配置
@Component
public class MqListener {
@RabbitListener(queues = "data.device.treated",containerFactory = "batchQueueRabbitListenerContainerFactory")
public void directQueue(@Header(AmqpHeaders.CHANNEL) Channel channel,@Payload byte[] msg, Message message) throws Exception {
}
}
config 里配置 队列
@Configuration
public class RabbitmqConfig {
@Autowired
private CachingConnectionFactory connectionFactory;
@Bean(name = "deviceTreatedQueue")
public Queue deviceTreatedQueue(){
return new Queue("data.device.treated",true);
}
@Bean
public DirectExchange deviceTreatedExchange(){
return new DirectExchange("data.device.treated.exchange",true, false);
}
@Bean
public Binding deviceTreatedBinding(){
return BindingBuilder.bind(deviceTreatedQueue()).to(deviceTreatedExchange()).with("data.device.treated.routing.key");
}
@Bean
public RabbitTemplate rabbitTemplate(){
connectionFactory.setPublisherConfirms(true);
connectionFactory.setPublisherReturns(true);
RabbitTemplate rabbitTemplate = new RabbitTemplate(connectionFactory);
rabbitTemplate.setMandatory(true);
rabbitTemplate.setConfirmCallback(new RabbitTemplate.ConfirmCallback() {
@Override
public void confirm(CorrelationData correlationData, boolean ack, String cause) {
log.info("消息发送成功:correlationData({}),ack({}),cause({})",correlationData,ack,cause);
}
});
rabbitTemplate.setReturnCallback(new RabbitTemplate.ReturnCallback() {
@Override
public void returnedMessage(Message message, int replyCode, String replyText, String exchange, String routingKey) {
log.info("消息丢失:exchange({}),route({}),replyCode({}),replyText({}),message:{}",exchange,routingKey,replyCode,replyText,message);
}
});
return rabbitTemplate;
}
}
原因:springboot 启动时去5672 端口监听配置的所有监听队列,若这个队列不存在,监听不到则会报错,需要在程序启动时注入这个队列