如何保证消息不丢失
方案一:开启事务模式
该方案会大幅降低性能,不建议使用
channel.txSelect 是将信道设置成事务模式,channel.txCommit 用来提交事务channel.txRollback 用来回滚事务
@Bean("rabbitTransactionManager")public RabbitTransactionManager rabbitTransactionManager(CachingConnectionFactory connectionFactory) {return new RabbitTransactionManager(connectionFactory);}
@Transactional(rollbackFor = Exception.class,transactionManager = "rabbitTransactionManager")public void sendMessage(Object msg) {// TODO 发送队列消息rabbitTemplate.convertAndSend(exchange,ingateQueue,msg);}
方案二:开启消息确认
rabbitmq:publisher-confirms: true # 开启消息发送确认(保证消息正常到达broker)publisher-returns: true # 保证消息正确路由到相应的队列listener:direct:acknowledge-mode: manual # 采用手动应答ack
// TODO 处理消息channel.basicAck(message.getMessageProperties().getDeliveryTag(), false); //ACK确认
消费顺序处理
发送消息使用convertSendAndReceive方法
# 输出时没有顺序,不需要等待,直接运行rabbitTemplate.convertAndSend()# 只有确定消费者接收到消息,才会发送下一条信息,每条消息之间会有间隔时间rabbitTemplate.convertSendAndReceive()
