一:前言概述
RabbitMQ原生系列文章RbbitMQ(五) -- 100%消息投递消费中详细介绍过这两个操作
- Confirm:消息是否投递到Exchange中,具备两个回调函数,通过不同的回调函数判断是否成功。也就是说不管客户端是否将消息成功投递到Exchange都会触发这个监听回调
- Mandatory:消息是否投递到Queue中,当消息到达Exchange后因为内部错误、路由错误等原因导致消息未到达Queue都会触发该回调信息。回调的参数中就包括了丢失的消息
二:SpringAMQP配置Confirm
2.1 Connection设置
很好理解的一个事情,原生操作中如果需要添加Confirm回调第一步就是需要将channel设置为confirm模式通过APIchannel.confirmSelect()
。SpringAMQP中的channel将通过配置的ConnectionFactory创建,自然需要提前进行声明。具体配置如下:将参数publisherConfirms参数设置为true
<!--定义连接工厂-->
<bean id="cacheConnectionFactory" class="org.springframework.amqp.rabbit.connection.CachingConnectionFactory">
<property name="addresses" value="${rabbitmq.host}:${rabbitmq.port}"/>
<property name="username" value="${rabbitmq.username}"/>
<property name="password" value="${rabbitmq.password}"/>
<property name="connectionNameStrategy" ref="connectionNameStrategy"/>
<!--声明信道为Confirm模式-->
<property name="publisherConfirms" value="true"/>
</bean>
2.2 template设置
完成Connection的配置以后还需要在template中配置confirm-callback属性,也就是你添加的Confirm处理实例
<!--定义模板-->
<rabbit:template id="jjRabbitTemplate" connection-factory="cacheConnectionFactory" message-converter="jackson2JsonMessageConvert"
confirm-callback="jjConfirmCallBack"/>
2.3 Confirm实现
具体的Confirm实现就是实现org.springframework.amqp.rabbit.core.RabbitTemplate
中的ConfirmCallback接口,当消息未发送到Exchange中时就会回调该实例中的confirm方法。具体参数含义作用如下表所示
序号 | 参数名 | 参数值 | 备注 |
---|---|---|---|
1 | correlationData | 消息发送时的correlationData对象 | 该对象构建时可以注入id、Message对象属性,可以帮助Confirm回调得到未成功发送的消息 |
2 | ack | true/false | 发送成功返回true/失败返回false |
3 | cause | 失败原因 | 可以根据返回失败的原因处理消息丢失的问题 |
/**
* @author zsl
* @version 1.0.0
* @date: 2020/5/11 11:12
**/
@Component
public class JjConfirmCallBack implements ConfirmCallback {
@Override
public void confirm (CorrelationData correlationData, boolean ack, String cause) {
}
}
三:SpringAMQP配置ManDatory
3.1 XML配置
与Confirm配置一致,使用的时候都会要求对Connection和Template进行配置。SpringAMQP中的Mandatory被封装为ReturnCallBack,相对于Confirm来讲需要在Template中多配置一个参数mandatory。具体如下所示:
<!--定义连接工厂-->
<bean id="cacheConnectionFactory" class="org.springframework.amqp.rabbit.connection.CachingConnectionFactory">
<property name="addresses" value="${rabbitmq.host}:${rabbitmq.port}"/>
<property name="username" value="${rabbitmq.username}"/>
<property name="password" value="${rabbitmq.password}"/>
<property name="connectionNameStrategy" ref="connectionNameStrategy"/>
<property name="publisherConfirms" value="true"/>
<!--声明ReturnCallBack-->
<property name="publisherReturns" value="true"/>
</bean>
<!--定义模板-->
<rabbit:template id="jjRabbitTemplate" connection-factory="cacheConnectionFactory" message-converter="jackson2JsonMessageConvert"
confirm-callback="jjConfirmCallBack"
mandatory="true" return-callback="jjReturnCallBack"/>
3.2 ReturnCallBack实现
具体的ReturnCallBack实现与Confirm一致,都是去实现org.springframework.amqp.rabbit.core.RabbitTemplate
中的ReturnCallback接口,参数列表含义如下:
序号 | 参数名 | 参数值 | 备注 |
---|---|---|---|
1 | message | 丢失的消息 | 可以用于重新投递获取记录 |
2 | replyCode | 返回的错误编码 | |
3 | replyText | 返回的错误描述 | 结合Code排查处理问题 |
4 | exchange | 丢消息的exchange | |
5 | routingKey | 丢失消息发送时的routingKey | message + exchange + routingKey正好可以重新发送消息 |
/**
* @author zsl
* @version 1.0.0
* @date: 2020/5/11 13:33
**/
@Component
public class JjReturnCallBack implements ReturnCallback {
@Override
public void returnedMessage (Message message, int replyCode, String replyText, String exchange, String routingKey) {
}
}