两步:
1. 配置 yaml 文件,打开确认机制的配置
2. 实现 return callback
return callback 一个 template 仅有一次即可;即在启动时注入。
配置的信息
有三个类型
none — 关闭配置
simple — 阻塞式
correlated — 异步
通常开启 异步处理 — correlated 。
配置完整信息 —— 最后两个配置项
spring:
rabbitmq:
host:
port:
virtual-host: /shopping
username: goods
password:
connection-timeout: 1s
template:
retry:
enabled: true
initial-interval: 1000ms
multiplier: 1
max-attempts: 3
publisher-confirm-type: correlated # 异步 | none 关闭 confirm | simple 阻塞
publisher-returns: true
代码
每次发送消息,都需要制定指定 confirm callback
ReturnCallback
@Configuration
@Slf4j
@RequiredArgsConstructor
public class MQConfig {
private final RabbitTemplate rabbitTemplate;
@PostConstruct
public void init() {
rabbitTemplate.setReturnsCallback(returnedMessage -> {
log.error(" Listener _ return callback");
log.debug("Exchange: {}",returnedMessage.getExchange());
log.debug("Message: {}",returnedMessage.getMessage());
log.debug("routingKey: {}",returnedMessage.getRoutingKey());
log.debug("replyCode: {}",returnedMessage.getReplyCode());
log.debug("replyText: {}",returnedMessage.getReplyText());
});
}
}
ConfirmCallback
先看结果 — 发送成功
编辑器成功结果提示
代码的配置信息参考这里: Direct exchange 定向路由,根据规则分配 Queue 消息,Spring AMQP-CSDN博客
application.yml 文件的配置,如上。
@SpringBootTest
@Slf4j
public class SpringAMQPTest {
@Autowired
private RabbitTemplate rabbitTemplate;
@Test
public void confirmCallbackTest() {
CorrelationData cd = new CorrelationData(UUID.randomUUID().toString());
cd.getFuture().addCallback(new ListenableFutureCallback<CorrelationData.Confirm>() {
@Override
public void onFailure(Throwable ex) {
log.error("SpringAMQP 异常,",ex.getMessage(), ex);
}
@Override
public void onSuccess(CorrelationData.Confirm result) {
if(result.isAck()) {
log.debug("confirm callback , message is right");
}else {
log.debug("confirm callback , message is not right", result.getReason());
}
// 消息重发
}
});
String exchangeName = "direct.exchange";
String routingKey = "one";
String message = "如花似锦的年纪";
rabbitTemplate.convertAndSend(exchangeName, routingKey, message,cd);
}
}
注意⚠️: 错误信息处理