一、消息可投递性
1、介绍
在使用rabbitmq传递消息时,作为消息发送方,为了消息能够可靠传递,杜绝消息的丢失或者传递失败的场景,rabbitmq提供了两种方式来控制消息传递的可靠性模式:
- confirm 确认模式
- rentun 退回模式
rabbitmq传递消息的整个过程:
producer -> rabbitmq broker -> exchange -> queue -> consumer
- confirm 确认模式:消息从producer 到 exchange 则会返回一个confirmCallback回调。
- rentun 退回模式:消息从exchange到queue 则会返回一个rentunCallback回调。
我们则可以通过这两种模式Callback来控制消息的可靠性传递
2、完成代码-confirm
确认 模式开启,在yml配置中加入 publisher-confirms: true
spring: rabbitmq: host: 10.147.17.158 #IP主机名 port: 5672 #端口 username: guest #用户名 password: guest #密码 virtual-host: / publisher-confirms: true
在rabbitTemplate中定义ConfirmCallBack回调函数
package com.ailuti.test; import com.ailuti.rabbitmq.config.RabbitMQConfig; import org.junit.Test; import org.junit.runner.RunWith; import org.springframework.amqp.rabbit.connection.CorrelationData; import org.springframework.amqp.rabbit.core.RabbitTemplate; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.test.context.SpringBootTest; import org.springframework.test.context.junit4.SpringRunner; @SpringBootTest @RunWith(SpringRunner.class) public class ProducerTest { @Autowired private RabbitTemplate rabbitTemplate; /** * 确认模式 步骤 * 1.模式开启,在yml配置中加入 publisher-confirms: true * 2.在rabbitTemplate中定义ConfirmCallBack回调函数 */ @Test public void textSend(){ rabbitTemplate.setConfirmCallback(new RabbitTemplate.ConfirmCallback() { /** * * @param correlationData 相关配置信息 * @param ack exchange 交换机是否成功收到消息。ture:成功,false:失败 * @param cause 失败的原因 */ @Override public void confirm(CorrelationData correlationData, boolean ack, String cause) { System.out.println("confirm 方法被执行了"); if(ack){ System.out.println("接收成功~ "); }else { System.out.println("接收失败:"+cause); //将来做一些处理,例如再次发送 } } }); //3.测试发送 rabbitTemplate.convertAndSend(RabbitMQConfig.exchange_name,"confirm","message confirm . hello world"); sleep(2000); } }
2、完成代码-return
开启回退模式 在yml配置 publisher-returns: true
spring: rabbitmq: host: 10.147.17.158 #IP主机名 port: 5672 #端口 username: guest #用户名 password: guest #密码 virtual-host: / publisher-confirms: true publisher-returns: true
在rabbitTemplate中定义ConfirmCallBack回调函数
/** * 回退模式 步骤 * 1.开启回退模式 在yml配置 publisher-returns: true * 2.设置ReturnCallBack * 3.设置Exchange 处理消息的模式 * (1)如果消息没有路由到Queue,则消息丢弃【默认】 * (2)如果消息没有路由到Queue,则返回消息给发送方 RuturnCallBack */ @Test public void testReturn() throws InterruptedException{ //设置交换机处理消息的模式 rabbitTemplate.setMandatory(true); rabbitTemplate.setReturnCallback(new RabbitTemplate.ReturnCallback() { /** * * @param message 消息对象 * @param i 错误码 * @param s 错误信息 * @param s1 交换机 * @param s2 路由键 */ @Override public void returnedMessage(Message message, int i, String s, String s1, String s2) { System.out.println("执行了,ReturnCallBack"); System.out.println("message:" + message); System.out.println("错误码:"+i +",错误信息:"+s); System.out.println("Exchange:"+s1); System.out.println("RoutingKey:"+s2); //以后写处理,例如路由到另外一个queue } }); //3.测试发送 rabbitTemplate.convertAndSend(RabbitMQConfig.exchange_name,"confirm","message confirm . hello world"); sleep(2000); }
在RabbitMQ中也提供了事务机制,但是性能较差,此处不做详解
使用channel下列方法,完成事务控制:
- teSelect(), 用于将当前channel设置成transaction模式
- txCommit(),用于提交事务
- txRollback(),用于回归事务
文章评论