Spring Rocketmq 普通消息 RocketMQTemplate的使用
)
前言
我是使用Spring注解的形式以及RocketMQTemplate来实现消息中间件RocketMq,欢迎留言讨论
1、第一种 以同步的方法实现
/**
* 普通消息示例
*
* @param message 接收需要发送的消息
* @return
*/
@Override
public String sendMessage(String message) {
//创建队列 MessageQueue 队列不要设置太大,默认值为4
rocketMQTemplate.getProducer().setDefaultTopicQueueNums(4);
//官方解释:为具有给定有效负载的消息创建新的构建器。
//获取一个MessageBUilder对象,只有一个参数 payload ,里面存储的是需要发送的消息
// 最后面接上的build()方法是将MessageBuilder对象转换为Message对象。
Message info = MessageBuilder.withPayload(message + (i++)).build();
// 以同步模式发送消息。此方法仅在发送过程完全完成时返回。可靠的同步传输广泛应用于重要通知信息、短信通知、短信营销系统等场合。
// 警告:该方法具有内推机构。那是。内部实现将在声明失败之前重试DefaultMQProducer.getRetryTimesWhenSendFailed次数。因此,多个消息可能潜在地传递给代理。这取决于应用程序开发人员来解决潜在的重复问题。
// 发送消息的方法
rocketMQTemplate.convertAndSend("MQ_TOPIC", info);
return "success:" + message;
}
// 发送消息的方法
rocketMQTemplate.convertAndSend("MQ_TOPIC", info);
convertAndSend() 方法实现的是RocketMQTemplate中的syncSend()方法,都是以同步的方法实现消息的发送,但不建议使用syncSend() 方法,因为没有对参数进行了序列化,运行速度会慢很多。
2、第二种 以异步方式实现
/**
* 普通消息示例
* 异步
*
* @param message 接收需要发送的消息
* @return
*/
@Override
public String sendMessage(String message) {
//创建队列 MessageQueue 队列不要设置太大,默认值为4
rocketMQTemplate.getProducer().setDefaultTopicQueueNums(4);
//官方解释:为具有给定有效负载的消息创建新的构建器。
//获取一个MessageBUilder对象,只有一个参数 payload ,里面存储的是需要发送的消息
// 最后面接上的build()方法是将MessageBuilder对象转换为Message对象。
Message info = MessageBuilder.withPayload(message + (i++)).build();
// 发送消息的方法 双向异步消息 会产生回调
// rocketMQTemplate.asyncSend("MQ_TOPIC", info, new SendCallback() {
// @Override
// public void onSuccess(SendResult sendResult) {
// System.out.println("成功回调消息");
// System.out.println(sendResult);
// }
//
// @Override
// public void onException(Throwable e) {
// System.out.println("回调发生异常了");
// System.out.println(e);
// }
// });
// 单向异步消息 不会产生回调
rocketMQTemplate.sendOneWay("MQ_TOPIC", info);
return "success:" + message;
}
同步的方式实现是通过rpc远程调用实现的,异步是在传递消息的时候加个中间件,也就是Broker Server,在启动rocketmq时,也需启动broker代理已实现异步的效果。