//生产者
RabbitTemplate.ConfirmCallback confirmCallback =
new RabbitTemplate.ConfirmCallback() {
public void confirm(CorrelationData correlationData, boolean ack, String cause) {
String messageId = correlationData.getId();
if (ack) {
//如果 confirm 返回成功 则进行更新
System.err.println("收到 confirm 为 true");
brokerMessageLogMapper.changeBrokerMessageLogStatus(messageId, Constants.ORDER_SEND_SUCCESS, new Date());
} else {
//失败则进行具体的后续操作:重试 或者补偿等手段
System.err.println("异常处理...");
}
}
};
//消费者
@RabbitHandler
public void onOrderMessage(
@Payload Order order,
Channel channel,
@Headers Map<String, Object> headers
) throws Exception {
System.err.println("订单 id" + order.getId());
Long deliverTag = (Long) headers.get(AmqpHeaders.DELIVERY_TAG);
//手工确认签收 ,消费者消费完消息主动的告诉 mq 我已经消费完了,false 是不支持批量接受
//一般的工作中也是使用手动的 ack,消费完之后要确认
channel.basicAck(deliverTag, false);
}
在消费端未启动的情况下,生产者的 ack 也为 true,这是为什么
如何才能在 consumer 中按照业务处理后,返回给生产者是否成功消费
这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。
V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。
V2EX is a community of developers, designers and creative people.