**发送消息(发送端-交换机-队列)**
总结:只有当消息确认ack为true且未执行失败回调方法时,才保证发送端消息已经成功发送!
执行失败回调方法时,说明消息已经发送到(broker)交换机,交换机路由到队列出现了问题。此时需要我们自己来解决
发送端信息成功到交换机确认机制:
前提:开启消息确认
connectionFactory.setPublisherConfirms(true);
如果成功,会给发送端一个为true的ack,表示发送成功!
如果失败,会给发送端一个为false的ack,表示发送失败!
代码如下:
/**
* 发送端是否发送到交换机
*/
public class RabbitmqConfirm implements RabbitTemplate.ConfirmCallback {
/**
* 发送端回调方法
* @param correlationData 发送到mq时传入的业务参数(例如:业务id)
* @param ack 结果标志
* true: 发送端 ——> 交换机 成功
* false:发送端 ——> 交换机 失败
* @param message 结果消息:ack为true时,返回为null
* ack为false时,返回失败消息
*/
@Override
public void confirm(CorrelationData correlationData, boolean ack, String message) {
System.out.println(correlationData.getId());
System.out.println(ack);
System.out.println(message);
}
}
交换机信息成功路由到队列确认机制:
前提:开启消息确认
connectionFactory.setPublisherConfirms(true);
开启失败回调
rabbitTemplate.setMandatory(true);
如果成功,则不会调用失败回调方法!
如果失败,则会调用失败回调方法!
代码如下:
/**
* 交换机是否发送到队列
*/
public class RabbitmqReturnConfirm implements RabbitTemplate.ReturnCallback {
/**
* 交换机发送队列失败回调:
*
* 采用一个不存在的routingKey可做测试
* @param message 发送的消息+消息配置信息
* @param replyCode 状态码
* @param replyText 状态内容
* @param exchange 交换机
* @param routingKey 路由键
*/
@Override
public void returnedMessage(Message message, int replyCode, String replyText, String exchange, String routingKey) {
System.out.println(message);
System.out.println(replyCode);
System.out.println(replyText);
System.out.println(exchange);
System.out.println(routingKey);
}
}
依赖pom:
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-amqp</artifactId>
<version>2.0.4.RELEASE</version>
</dependency>