RabbitMQ系列【17】RabbitOperations接口详解
admin
2024-03-03 08:54:55
0

有道无术,术尚可求,有术无道,止于术。

文章目录

    • 前言
    • send
    • convertAndSend
    • convertSendAndReceive
    • execute
    • invoke
    • waitForConfirms
    • getConnectionFactory
    • Other

前言

在上一篇,我们介绍了RabbitTemplate 实现AmqpTemplate接口的所有方法,接下来学习下其实现的另外一个接口RabbitOperations

AmqpTemplate是对AMQP协议的支持,完成了基本的发送、接收消息,而RabbitOperations是对RabbitMQ的直接集成,提供了更细致的操作。

send

send 方法,主要是添加了一个CorrelationData参数。

CorrelationData用于发布确认、退回模式时进行数据封装,该对象会返回ACK以及原因,开启了退回模式时,还会返回退回信息。

public class CorrelationData implements Correlation {// 异步执行的结果,Confirm表示返回结果的类型private final SettableListenableFuture future = new SettableListenableFuture();// 唯一ID,如果未提供id将自动设置为唯一值。private volatile String id;// 退回时返回信息private volatile ReturnedMessage returnedMessage;
}
	// 发送消息,传递CorrelationData 对象default void send(String routingKey, Message message, CorrelationData correlationData)throws AmqpException {throw new UnsupportedOperationException("This implementation does not support this method");}// 指定交换机、路由、传递CorrelationData 对象void send(String exchange, String routingKey, Message message, CorrelationData correlationData)throws AmqpException;

convertAndSend

convertAndSendsend方法的基础上,可以直接发送JAVA 对象,并可以添加一个MessagePostProcessor 消息处理器。

	// 使用自定义路由KEY。发送消息到默认交换机,并携带CorrelationData void convertAndSend(String routingKey, Object message, CorrelationData correlationData) throws AmqpException;void convertAndSend(String exchange, String routingKey, Object message, CorrelationData correlationData)throws AmqpException;void convertAndSend(Object message, MessagePostProcessor messagePostProcessor, CorrelationData correlationData)throws AmqpException;void convertAndSend(String routingKey, Object message, MessagePostProcessor messagePostProcessor,CorrelationData correlationData) throws AmqpException;void convertAndSend(String exchange, String routingKey, Object message, MessagePostProcessor messagePostProcessor,CorrelationData correlationData) throws AmqpException;void correlationConvertAndSend(Object message, CorrelationData correlationData) throws AmqpException;

convertSendAndReceive

convertSendAndReceiveAmqpTemplate接口中发送并接收消息一样,是RPC模式,区别是多了个CorrelationData 参数。

	@NullableObject convertSendAndReceive(Object message, CorrelationData correlationData) throws AmqpException;@NullableObject convertSendAndReceive(String routingKey, Object message, CorrelationData correlationData)throws AmqpException;@NullableObject convertSendAndReceive(String exchange, String routingKey, Object message,CorrelationData correlationData) throws AmqpException;@NullableObject convertSendAndReceive(Object message, MessagePostProcessor messagePostProcessor,CorrelationData correlationData) throws AmqpException;@NullableObject convertSendAndReceive(String routingKey, Object message,MessagePostProcessor messagePostProcessor, CorrelationData correlationData) throws AmqpException;@NullableObject convertSendAndReceive(String exchange, String routingKey, Object message,MessagePostProcessor messagePostProcessor, CorrelationData correlationData)throws AmqpException;@Nullable T convertSendAndReceiveAsType(Object message, CorrelationData correlationData,ParameterizedTypeReference responseType) throws AmqpException;@Nullable T convertSendAndReceiveAsType(String routingKey, Object message, CorrelationData correlationData,ParameterizedTypeReference responseType) throws AmqpException;@Nullabledefault  T convertSendAndReceiveAsType(String exchange, String routingKey, Object message,@Nullable CorrelationData correlationData, ParameterizedTypeReference responseType)throws AmqpException {return convertSendAndReceiveAsType(exchange, routingKey, message, null, correlationData, responseType);}@Nullable T convertSendAndReceiveAsType(Object message, MessagePostProcessor messagePostProcessor,CorrelationData correlationData, ParameterizedTypeReference responseType) throws AmqpException;@Nullable T convertSendAndReceiveAsType(String routingKey, Object message,MessagePostProcessor messagePostProcessor, CorrelationData correlationData,ParameterizedTypeReference responseType) throws AmqpException;@Nullable T convertSendAndReceiveAsType(String exchange, String routingKey, Object message,@Nullable MessagePostProcessor messagePostProcessor,@Nullable CorrelationData correlationData,ParameterizedTypeReference responseType) throws AmqpException;

execute

execute方法可以获取原生Channel执行操作,需要一个ChannelCallback参数。

	@Nullable T execute(ChannelCallback action) throws AmqpException;

ChannelCallback是一个函数式接口,使用该接口,可以获取RabbitMQChannel,执行任意操作,并返回结果。

@FunctionalInterface
public interface ChannelCallback {/*** @param channel 通道* @return 返回结果*/@NullableT doInRabbit(Channel var1) throws Exception;
}

示例:

        ChannelCallback stringChannelCallback = new ChannelCallback() {@Overridepublic Boolean doInRabbit(Channel channel) throws Exception {// 调用Channel 发送消息channel.basicPublish(MqBizConfig.BIZ_EXCHANGE,MqBizConfig.BIZ_ROUTE_KEY,null,"消息".getBytes());System.out.println("doInRabbit");return true;}};Boolean execute = rabbitTemplate.execute(stringChannelCallback);System.out.println("结果:"+execute);

invoke

invoke方法需要一个OperationsCallback参数,在该对象的doInRabbit()方法中,任何操作都使用相同的专用通道,该通道将在结束时关闭(不会返回到缓存)。这种使用方式就叫做范围内操作。

	@Nullabledefault  T invoke(OperationsCallback action) throws AmqpException {ret@Nullable T invoke(OperationsCallback action, @Nullable com.rabbitmq.client.ConfirmCallback acks,@Nullable com.rabbitmq.client.ConfirmCallback nacks);
}

OperationsCallback操作回调,可以获取RabbitOperations 执行操作,并返回结果。

	@FunctionalInterfaceinterface OperationsCallback {/*** @param operations RabbitOperations.* @return 结果.*/@NullableT doInRabbit(RabbitOperations operations);
}

waitForConfirms

waitForConfirmswaitForConfirmsOrDie都是等待确认,但是必须在invoke方法中使用,

	// 等待确认 boolean waitForConfirms(long timeout) throws AmqpException;// 等待确认,异常后信道被关闭,生产者发布不能继续发布消息void waitForConfirmsOrDie(long timeout) throws AmqpException;

getConnectionFactory

返回此操作的连接工厂。

	ConnectionFactory getConnectionFactory();

Other

startstop没有实现的方法,只是为了向后兼容。

	@Overridedefault void start() {// No-op - implemented for backward compatibility}@Overridedefault void stop() {// No-op - implemented for backward compatibility}@Overridedefault boolean isRunning() {return false;}

相关内容

热门资讯

跨境电商巨无霸,赴港IPO获证... 来源:上海证券报 7月10日,中国证监会国际合作司发布关于SHEIN Global Holdings...
陪爸妈走过的第四个城市 陪爸妈走过的第四个城市 开篇 今年春天,趁着天气刚刚好,我又带着爸妈出了趟门。算上这次,是陪他们走...
百度沈抖:未来 90% 工作都... “未来90%的工作,都可能有智能体深度参与、协助完成。”在百度AIDAY百度搭子专场上,百度集团执行...
港股风向标|恒指短线放量滞涨 ... 财联社7月10日讯(编辑 冯轶)今日港股再度冲高回落,三大指数午后集体走弱。截至收盘,恒生指数、国企...
MLCC周期全面爆发!风华高科... 7月10日,国内被动元件龙头风华高科(000636.SZ)披露2026年半年度业绩预告,上半年净利润...
关停杠杆炒金!银行个人贵金属代... 今年6月以来,交通银行、招商银行、工商银行、建设银行等多家银行相继发布公告,宣布将于7月下旬起停办代...
原创 许... 许家印当年为何跟黄有龙搞在一起?背后到底有何猫腻?许家印跟黄有龙堪称是中国资本市场的两大奇人。一个凭...
世界杯第29日前瞻:西班牙vs... 北京时间7月11日凌晨3点,2026年美加墨世界杯进入第29个比赛日的争夺,将展开第二场1/4决赛争...
食品饮料周报:白酒去库存加速,... 证券之星食品饮料行业周报:2026年7月6日-2026年7月10日,沪深300指数下跌1.27%,申...
沈阳闲置黄金变现爆发,宏昇贵金... 近期,国际黄金价格持续震荡上行,沈阳地区贵金属回收市场迎来交易热潮。随着居民家庭闲置黄金存量的释放,...
Claude Code “高危... 出品 | 妙投APP 作者 | 张贝贝 编辑 | 丁萍 头图 | AI生图 7月8日,一则关于Cla...
新豪轩门窗X新华网《极致中国造... 从“中国制造”的规模优势迈向“中国创造”的价值跃升,中国品牌正以持续创新重塑全球竞争力。在这一进程中...
上市械企董事长,被女儿、女婿联... 来源:医疗器械经销商联盟 7月8日,科创板上市公司奥精医疗突发重磅公告,瞬间引爆资本市场与舆论圈。公...
汕头市优佳适科技有限公司成立 ... 天眼查App显示,近日,汕头市优佳适科技有限公司成立,注册资本50万人民币,经营范围为一般项目:技术...
砍掉两百个BU与近千家代持外壳... 在智能清洁硬件赛道凭借激进出海与疯狂营销一路狂飙的追觅(Dreame),突然在资本市场的前夜迎来了最...
原创 昨... 美东时间 7 月 9 日夜,纽约债市收盘钟声敲响时,交易大厅里紧绷了一周的情绪终于松了下来。本周总额...
段永平再次增持泡泡玛特 持股比... 观点网讯:7月10日,据港交所披露,知名投资人段永平再度增持泡泡玛特股票。 此次增持后,段永平持股数...
包揽全球80%的产能,又一个行... 作者: 快刀财经 郑栾 近日,新消费行业又迎来一笔久违的大额融资——咖爷科技宣布完成B轮融资,由美...
外储增配香港资产,可能会买啥? 界面新闻记者 | 杨志锦 界面新闻编辑 | 王姝 本周,央行行长潘功胜在香港的讲话引起市场广泛关...
最贵一套1.5亿,上海徐汇两大... 界面新闻记者 | 王婷婷 上海顶豪市场年度大戏来了。 7月11日,上海西岸美高梅酒店将迎来两大豪宅...