RocketMQ 常见面试题(四)

news/2024/11/17 21:55:07/

RocketMQTemplate 常用方法以及介绍

RocketMQTemplate是SpringBoot整合RocketMQ的核心类,它封装了RocketMQ的Java SDK,提供了一系列方便的方法用于发送消息。常用的方法如下:

  1. 同步发送消息:SendResult syncSend(String destination, Message<?> message) throws RocketMQException,该方法用于同步发送消息,destination表示消息发送目的地,可以是主题或者队列,message表示消息内容,返回SendResult对象表示发送结果。

  2. 异步发送消息:void asyncSend(String destination, Message<?> message, SendCallback sendCallback) throws RocketMQException,该方法用于异步发送消息,destination表示消息发送目的地,可以是主题或者队列,message表示消息内容,sendCallback表示发送成功或失败时的回调函数。

  3. 单向发送消息:void sendOneWay(String destination, Message<?> message) throws RocketMQException,该方法用于单向发送消息,即不关心发送结果,destination表示消息发送目的地,可以是主题或者队列,message表示消息内容。

  4. 发送顺序消息:SendResult send(String destination, Message<?> message, MessageQueueSelector selector, Object arg) throws RocketMQException,该方法用于发送顺序消息,destination表示消息发送目的地,可以是主题或者队列,message表示消息内容,selector表示选择队列的策略,arg表示传递的参数。

  5. 发送事务消息:TransactionSendResult sendMessageInTransaction(Message<?> msg, Object arg) throws RocketMQException,该方法用于发送事务消息,msg表示消息内容,arg表示传递的参数。

除了上述常用方法外,RocketMQTemplate还提供了其他一些方法,如批量发送消息、延迟发送消息等,可以根据实际需求选择使用。

介绍一下 convertAndSend() 方法

convertAndSend是RocketMQTemplate的一个重载方法,用于将Java对象转换为消息并发送。该方法的定义如下:

<T> SendResult convertAndSend(String destination, T message) throws RocketMQException;

其中,destination表示消息发送目的地,可以是主题或者队列,message表示Java对象,会自动将其转换为消息发送。在将Java对象转换为消息时,需要使用消息转换器,可以通过设置RocketMQTemplate的messageConverter属性来指定转换器,例如:

rocketMQTemplate.setMessageConverter(new Jackson2JsonMessageConverter());

以上代码指定了使用Jackson2JsonMessageConverter作为消息转换器,将Java对象转换为JSON格式的消息发送。在调用convertAndSend方法时,只需要传入目的地和Java对象即可,例如:

User user = new User("Tom", 18);
rocketMQTemplate.convertAndSend("topic_test", user);

以上代码将Java对象user转换为消息并发送到主题topic_test中。

详细介绍一下 convertAndSend() 及其重载方法以及它是同步发送还是异步发送

convertAndSend方法还有另外两个重载方法,分别是:

<T> SendResult convertAndSend(String destination, T message, MessagePostProcessor messagePostProcessor) throws RocketMQException;
<T> void convertAndSend(String destination, T message, SendCallback sendCallback) throws RocketMQException;

第一个重载方法可以在发送消息前对消息进行一些处理,例如设置消息头、消息属性等,需要传入一个MessagePostProcessor对象。例如:

rocketMQTemplate.convertAndSend("topic_test", user, new MessagePostProcessor() {@Overridepublic Message postProcessMessage(Message message) throws RocketMQException {// 设置消息属性message.putUserProperty("key", "value");return message;}
});

以上代码在发送消息前设置了消息属性,将会在消息发送时携带该属性。

第二个重载方法用于异步发送消息,会在发送消息后立即返回,不会等待发送结果。需要传入一个SendCallback对象,用于处理发送结果。例如:

rocketMQTemplate.convertAndSend("topic_test", user, new SendCallback() {@Overridepublic void onSuccess(SendResult sendResult) {// 发送成功System.out.println("发送成功,消息ID:" + sendResult.getMsgId());}@Overridepublic void onException(Throwable throwable) {// 发送失败System.out.println("发送失败,原因:" + throwable.getMessage());}
});

以上代码异步发送消息,在发送成功或失败时分别打印消息ID和失败原因。可以看到,convertAndSend方法的重载方法既支持同步发送消息,也支持异步发送消息,具体使用哪种方式取决于传入的参数。

传入什么参数是同步发送什么是异步发送

在RocketMQTemplate中,convertAndSend方法有以下两种重载形式:

<T> SendResult convertAndSend(String destination, T message) throws RocketMQException;
<T> void convertAndSend(String destination, T message, SendCallback sendCallback) throws RocketMQException;

其中,第一种是同步发送消息,第二种是异步发送消息。
如果只调用convertAndSend方法,并且不传入SendCallback对象,则会使用同步方式发送消息。例如:

rocketMQTemplate.convertAndSend("topic_test", user);

以上代码会使用同步方式发送消息,并阻塞当前线程等待发送结果。如果发送成功,该方法会返回SendResult对象;如果发送失败,该方法会抛出RocketMQException异常。

如果需要使用异步方式发送消息,则需要调用第二种重载形式,并传入SendCallback对象。例如:

rocketMQTemplate.convertAndSend("topic_test", user, new SendCallback() {@Overridepublic void onSuccess(SendResult sendResult) {// 发送成功System.out.println("发送成功,消息ID:" + sendResult.getMsgId());}@Overridepublic void onException(Throwable throwable) {// 发送失败System.out.println("发送失败,原因:" + throwable.getMessage());}
});

以上代码会使用异步方式发送消息,并立即返回,不会阻塞当前线程。当发送结果可用时,会调用SendCallback对象的onSuccess方法或者onException方法,分别处理发送成功和失败的情况。

convertAndSend(“topic_test”, user, new SendCallback() )为什么我的没有这个方法

convertAndSend方法的重载形式可能因为不同的版本而略有不同。如果您的版本没有convertAndSend(String destination, T message, SendCallback sendCallback)方法,可能是因为您使用的是较早的版本。
如果您需要在发送消息时使用异步方式,并且需要处理发送结果,可以考虑使用send(String destination, Message<?> message, SendCallback sendCallback)方法,该方法是RocketMQTemplate的另一个方法,用于发送org.apache.rocketmq.common.message.Message类型的消息。该方法的定义如下:

void send(String destination, Message<?> message, SendCallback sendCallback) throws RocketMQException;

其中,destination表示消息发送目的地,可以是主题或者队列,message表示RocketMQ消息。在调用该方法时,需要手动创建RocketMQ消息,并将Java对象转换为消息体,例如:

User user = new User("Tom", 18);
Message<User> message = MessageBuilder.withPayload(user).build();
rocketMQTemplate.send("topic_test", message, new SendCallback() {@Overridepublic void onSuccess(SendResult sendResult) {// 发送成功System.out.println("发送成功,消息ID:" + sendResult.getMsgId());}@Overridepublic void onException(Throwable throwable) {// 发送失败System.out.println("发送失败,原因:" + throwable.getMessage());}
});

以上代码手动创建了一个RocketMQ消息,并将Java对象user作为消息体,使用send方法发送消息,在发送成功或失败时分别打印消息ID和失败原因。可以看到,send方法支持异步发送消息,并且可以处理发送结果,是一个比较灵活的发送消息方式。


http://www.ppmy.cn/news/580825.html

相关文章

实验九 单周期MIPS CPU设计实验(基于Logisim)

一、实验目的 学生掌握控制器设计的基本原理&#xff0c;能利用硬布线控制器的设计原理在Logisim平台中设计实现MIPS单周期CPU。 二、实验内容 利用运算器实验&#xff0c;存储系统实验中构建的运算器、寄存器文件、存储系统等部件以及Logisim中其它功能部件构建一个32位MIPS …

上海交通大学计算机系非全日制,关于上海交通大学非全日制研究生中最便宜的专业...

大家选择在职研究生的方式参加学习的时候都知道不同的方式报考不同学费缴纳也是不同的&#xff0c;非全日制研究生的方式在我们参加报考的时候需要以专业硕士的方式参加报考&#xff0c;需要考生缴纳的费用也是根据不同学校和专业选择不同的&#xff0c;那么关于上海交通大学非…

爱奇艺会员哪里买便宜,什么时候最便宜

很多同学不知道爱奇艺会员哪里买便宜&#xff0c;什么时候最便宜。喜欢追剧看影视的朋友都会选择开通影视网站的会员&#xff0c;其中爱奇艺是选择比较多的一个&#xff0c;下面就和大家分享爱奇艺会员哪里买便宜&#xff0c;什么时候买最便宜。 1.购买爱奇艺会员不建议直接官方…

购买水果最便宜的方案算法题-C++实现

前言 本文记录4月27日晚7点一场软件开发岗笔试的题目&#xff0c;思路以及代码实现。 一、题目简介 题目&#xff1a; 购买水果最便宜的方案 具体描述&#xff1a; m个水果超市在1~n个小时的不同时间段提供不同价格的打折水果&#xff0c;如果某餐厅在每个小时都要采购一种水…

在linux/Ubuntu下调试最便宜的双目摄像头(含Linux版本上位机)CAM5031/CHUSEI 3D WEBCAM 解决只能开单目的问题

在淘宝上买了一个非常便宜的双目摄像头 价格好像只有20来着&#xff0c;测试和学习的首选啊 为了配合ubuntu上的ros使用需要把代码放在ubuntu上运行&#xff0c;卖家也提供了关于linux调试摄像头的资料。 但是摄像头默认的模式是单目&#xff0c;要切换为双目只能使用卖家提供的…

LeetCode K站中转内最便宜的航班(回溯法、动态规划)

有 n 个城市通过 m 个航班连接。每个航班都从城市 u 开始&#xff0c;以价格 w 抵达 v。 现在给定所有的城市和航班&#xff0c;以及出发城市 src 和目的地 dst&#xff0c;你的任务是找到从 src 到 dst 最多经过 k 站中转的最便宜的价格。 如果没有这样的路线&#xff0c;则输…

画个板子玩一玩STM32F030F4P6,也许是最便宜的32bit MCU

前言&#xff0c;什么是STM32F030F4P6 STM32目前最便宜的芯片之一应该就是这一块&#xff0c;STM32F030F4P6&#xff0c;这一个芯片没有USB&#xff0c;但是其他都有&#xff0c;引脚少&#xff0c;价格低廉&#xff0c;如果找不到原厂&#xff0c;可以买替代的国产芯片&#…

Java实现 LeetCode 787 K 站中转内最便宜的航班(两种DP)

787. K 站中转内最便宜的航班 有 n 个城市通过 m 个航班连接。每个航班都从城市 u 开始&#xff0c;以价格 w 抵达 v。 现在给定所有的城市和航班&#xff0c;以及出发城市 src 和目的地 dst&#xff0c;你的任务是找到从 src 到 dst 最多经过 k 站中转的最便宜的价格。 如果…