1 消息的可靠性传递
PS:以spring整合的rabbitmq项目为例
confirm——确认模式
步骤:
1、在配置文件定义要设置消息可靠性的队列并绑定交换机
<!-- 消息的可靠性传递-->
<rabbit:queue id="test_queue_confirm" name="test_queue_confirm"></rabbit:queue>
<!-- 交换机绑定队列-->
<rabbit:direct-exchange name="test_exchange_confirm">
<rabbit:bindings>
<rabbit:binding queue="test_queue_confirm" key="confirm"></rabbit:binding>
</rabbit:bindings>
</rabbit:direct-exchange>
2、开启确认模式
3、测试代码:
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(locations = "classpath:spring-rabbitmq-producer.xml")
public class producerTest {
@Autowired
private RabbitTemplate rabbitTemplate;
@Test
public void test(){
//定义回调
rabbitTemplate.setConfirmCallback(new RabbitTemplate.ConfirmCallback() {
/*
* CorrelationData correlationData, 配置相关信息
* boolean b,交换机是否接受到了消息
* String s,接受失败原因
*
* */
@Override
public void confirm(CorrelationData correlationData, boolean b, String s) {
System.out.println("confirms--------");
if (b) {
System.out.println("success----");
}else {
System.out.println("failed-----"+s);
}
}
});
//发送消息
rabbitTemplate.convertAndSend("test_exchange_confirm","confirm","confirm消息-----------");
}
作用:在发送消息到交换机可以判断是否发送成功,
根据发送成功与否在回调函数里做相关的业务操作。
return——回退模式
步骤:(前期准备基本和确认模式无异)
1、开启回退模式
2、测试代码
@Test
public void test2() {
//回退模式:消息发给Exchange成功后,由Exchange路由到queue失败了才会执行回调函数
//交换机处理失败消息的模式:1、直接丢弃 2、返回消息给发送方returnCallBack
rabbitTemplate.setMandatory(true);//设置则是返回消息给发送方returnCallBack,不设置则直接丢弃
//设置ReturnCallBack回调函数
rabbitTemplate.setReturnCallback(new RabbitTemplate.ReturnCallback() {
@Override
public void returnedMessage(Message message, int i, String s, String s1, String s2) {
System.out.println("回调函数执行-----");
}
});
//发送消息
rabbitTemplate.convertAndSend("test_exchange_confirm", "confirm11", "confirm消息-----------");
}
作用:如果交换机路由到queue失败了,消息会返回到returnCallBack,
在回调函数的参数里可以获取到消息的相关信息,比如信息体、路由键。。。
再做相关的业务操作,这就是return的作用
说说两种模式的区别:confirm是消息传给交换机失败执行;return是消息从交换机传递给queue执行。