前言
整合RocketMQ,RocketMQ消息异步发送,消息回调。
环境准备
安装和启动RocketMQ,请见:springboot基础(48): RocketMQ的安装
如何整合RocketMQ
- 导入依赖,该依赖没有被springboot收录,所以需要指定版本。
<!-- https://mvnrepository.com/artifact/org.apache.rocketmq/rocketmq-spring-boot-starter -->
<dependency>
<groupId>org.apache.rocketmq</groupId>
<artifactId>rocketmq-spring-boot-starter</artifactId>
<version>2.2.2</version>
</dependency>
- 编写接口发送消息
@RestController
@RequestMapping("/msg")
public class MessageController {
@Autowired
private MessageService messageService;
@GetMapping("{id}")
public String sendMessage(@PathVariable String id){
messageService.sendMessage(id);
return "success";
}
}
public interface MessageService {
void sendMessage(String id);
String doMessage();
}
- 编写接口实现(用于前台发送)
@Service
public class MessageRocketmqServiceImpl implements MessageService {
@Autowired
private RocketMQTemplate rocketMQTemplate;
@Override
public void sendMessage(String id) {
System.out.println("待发送消息加入到队列(rocketmq )id:"+id);
rocketMQTemplate.convertAndSend("msgid",id);
}
@Override
public String doMessage() {
return null;
}
}
- 定义监听进行异步消息发送
/**
* 监听器
*/
@Component
@RocketMQMessageListener(topic = "msgid",consumerGroup = "group_rocketmq")
public class RocketMessageListener implements RocketMQListener<String> {
@Override
public void onMessage(String id) {
System.out.println("完成短信的发送,id :"+id);
}
}
- 配置文件
rocketmq:
name-server: localhost:9876
producer:
group: group_rocketmq #需要指定默认的组名
- 启动运行服务器,并测试发送消息
异步发送与回调
上面我们在执行convertAndSend方法时,实际上使用的同步发送,而通常我们发送消息到队列需要使用异步方式。
如何使用异步消息发送?
直接使用asyncSend异步发送的方式。
public void sendMessage(String id) {
System.out.println("待发送消息加入到队列(rocketmq )id:"+id);
// rocketMQTemplate.convertAndSend("msgid",id);
rocketMQTemplate.asyncSend("msgid",id,null);
}
如何消息回调?
asyncSend方法最后一个参数是sendCallback,发送后回调,我们只需要传入一个sendCallback的实现即可。这个回调是指消息发送到RocketMQ服务器的回调,并不表示监听器是否处理这条消息。
public void sendMessage(String id) {
System.out.println("待发送消息加入到队列(rocketmq )id:"+id);
// rocketMQTemplate.convertAndSend("msgid",id);
SendCallback sendCallback=new SendCallback() {
@Override
public void onSuccess(SendResult sendResult) {
System.out.println("发送成功回调"+sendResult.toString());
}
@Override
public void onException(Throwable throwable) {
System.out.println("发送异常回调");
}
};
rocketMQTemplate.asyncSend("msgid",id,sendCallback);
}
再次启动服务器发送消息测试
如何设置回调时间?
设置发送到RocketMQ服务器的超时时间,单位毫秒。
rocketMQTemplate.asyncSend("abcd",id,sendCallback,5000);