消息确认机制:
-
保证消息不丢失,
- 使用事务发送消息会导致性能下降
-
publisher ConfirmCallback: 生产者消息确认机制, rabbit接受到消息就会执行回调
// 配置生产者消息确认机制 spring.rabbit.pulisher-confirms = true @PostConstruct //当前class配置类创建完对象后,执行此方法 public void rabbitConfirmCallback(){ rabbitTemplate.setConfirmCallback(new RabbitTemplate.ConfirmCallback() { /** * 生产者成功投递消息后执行的回调函数, * @param correlationData 当前消息相关数据 * @param ack 消息是否成功收到 * @param cause 失败的原因 */ @Override public void confirm(CorrelationData correlationData, boolean ack, String cause) { } }); }
-
publisher returnCallback: 生产者消息退回机制, 消息正确投递到队列时执行的回调
spring.rabbitmq.pulisher-returns = true spring.rabbitmq.template.mandatory= true // @PostConstruct //当前class配置类创建完对象后,执行此方法 public void rabbitConfirmCallback(){ rabbitTemplate.setReturnCallback(new RabbitTemplate.ReturnCallback() { /** * 只要消息没有投递到队列,就会执行此回调函数 * @param message 投递失败的消息信息 * @param replyCode 回复的状态码 * @param replyText 回复的文本 * @param exchange 发送该消息的交换机 * @param routingKey 该消息使用的路由键 */ @Override public void returnedMessage(Message message, int replyCode, String replyText, String exchange, String routingKey) { } }); }
-
ACK: 消费者消息确认机制, 消息成功消费后, 通知队列删除该消息
spring.rabbitmq.listener.simple.acknowledge-mode = manual // 开启手动确认消息消费机制 // 默认自动ack, 消费成功后自动删除 @RabbitListener(queues = {"block-sms-queue"}) public void testOne(Message message, OrderReturnReasonEntity entity, Channel channels){ long deliveryTag = message.getMessageProperties().getDeliveryTag(); try { if (deliveryTag % 2 ==0) { // 消费者 确认消费当前消息, // 参数: 每个消息的标识, 是否批量确认消费 channels.basicAck(deliveryTag, false); log.info("消费成功--:{}",deliveryTag); System.out.println(entity.getId() + "---"+entity); }else{ // 拒绝消费当前消息,并把消息重新放回队列中 // 参数: 每个消息的标识, 是否批量拒绝消费, 是否重新把消息返回放回队列 channels.basicNack(deliveryTag,false,true); log.info("消费失败--:{}",deliveryTag); } } catch (IOException e) { e.printStackTrace(); } } // 业务成功完成, 确认消费 channels.basicAck(deliveryTag, false); // 业务失败, 拒绝消费 channels.basicNack(deliveryTag,false,true);