Springboot整合RocketMQ之生产者

本文介绍了如何在Springboot中整合使用RocketMQ,涵盖了同步、异步、单向消息发送,顺序消息、延时消息以及事务消息的发送方法。详细讲解了每个模式的实现原理和代码示例,帮助开发者理解RocketMQ在不同场景下的应用。
摘要由CSDN通过智能技术生成

上一篇rocketMQ文章介绍相关概念与理论,接下来看下整合springboot使用

1、普通消息发送


如果是集群就先创建Topic

  • 向集群中创建 Topic
    发送消息前,需要确保目标主题已经被创建和初始化。可以利用 RocketMQ Admin 工具创建目标 Topic 。
    RocketMQ 部署安装包默认开启了 autoCreateTopicEnable 配置,会自动为发送的消息创建 Topic,但该特性仅推荐在初期测试时使用。
    生产环境强烈建议管理所有主题的生命周期,关闭自动创建参数,以避免生产集群出现大量无效主题,无法管理和回收,造成集群注册压力增大,影响生产集群的稳定性。
> sh bin/mqadmin updateTopic -c DefaultCluster -t TopicTest -n 127.0.0.1:9876
create topic to 127.0.0.1:10911 success.
TopicConfig [topicName=TopicTest, readQueueNums=8, writeQueueNums=8, perm=RW-, topicFilterType=SINGLE_TAG, topicSysFlag=0, order=false, attributes=null]
  • 添加客户端依赖
<!--springboot用的2.3.12.RELEASE-->
			<dependency>
                <groupId>org.apache.rocketmq</groupId>
                <artifactId>rocketmq-spring-boot-starter</artifactId>
                <version>2.2.0</version>
            </dependency>
  • 配置信息
server:
  port: 8086
#rocketmq配置信息
rocketmq:
  #nameservice服务器地址(多个以英文逗号隔开)
  name-server: 服务器ip:9876
  #生产者配置 【这些值应放在.properties文件中!】
  producer:
#    #组名
    group: shen-producer-group
#    send-message-timeout: 3000 # 发送消息超时时间,单位:毫秒。默认为 3000 。
#    compress-message-body-threshold: 4096 # 消息压缩阀值,当消息体的大小超过该阀值后,进行消息压缩。默认为 4 * 1024B
#    max-message-size: 4194304 # 消息体的最大允许大小。。默认为 4 * 1024 * 1024B
#    retry-times-when-send-failed: 2 # 同步发送消息时,失败重试次数。默认为 2 次。
#    retry-times-when-send-async-failed: 2 # 异步发送消息时,失败重试次数。默认为 2 次。
#    retry-next-server: false # 发送消息给 Broker 时,如果发送失败,是否重试另外一台 Broker 。默认为 false
#    #目的地(topic:tag)
#    #topic
#    topic: shen-topic
#    #sync tag(同步消息tag)
#    sync-tag: shen-sync-tags
#    #async tag(异步消息tag)
#    async-tag: shen-async-tags
#    #oneway tag(单向消息tag)
#    oneway-tag: shen-oneway-tags

logging:
  file:
    path: E:\workspace\log\mq_product\
#    path: /usr/log/mqproductservice/mqproductservice.log
  level:
    root: INFO
    com.anran.projectmanage.mapper: DEBUG
# 不同类型的消息使用不同的topic
rocketmq.producer.topic: shen-topic
rocketmq.producer.group: shen-producer-group
# sync tag(同步消息tag)
rocketmq.producer.sync-tag: TagS
#async tag(异步消息tag)
rocketmq.producer.async-tag: TagA
#oneway tag(单向消息tag)
rocketmq.producer.oneway-tag: TagO
@RestController
@RequestMapping("/rocket")
public class RocketController {
   
    @Value(value = "${rocketmq.producer.topic}:${rocketmq.producer.sync-tag}")
    private String syncDestination;
    @Value(value = "${rocketmq.producer.topic}")
    private String syncTopic;
    @Value(value = "${rocketmq.producer.sync-tag}")
    private String syncTag;

    @Autowired
    private RocketMQTemplate rocketMQTemplate;
  • 消息发送
    Apache RocketMQ可用于以三种方式发送消息:同步、异步和单向传输。前两种消息类型是可靠的,因为无论它们是否成功发送都有响应。

1.1 同步发送

同步发送是最常用的方式,是指消息发送方发出一条消息后,会在收到服务端同步响应之后才发下一条消息的通讯方式,可靠的同步传输被广泛应用于各种场景,如重要的通知消息、短消息通知等。
在这里插入图片描述
同步发送的整个代码流程如下:

  1. 首先会创建一个producer。普通消息可以创建DefaultMQProducer,创建时需要填写生产组的名称,生产者组是指同一类Producer的集合,这类Producer发送同一类消息且发送逻辑一致。
  2. 设置 NameServer 的地址。Apache RocketMQ很多方式设置NameServer地址(客户端配置中有介绍),这里是在代码中调用producer的API setNamesrvAddr进行设置,如果有多个NameServer,中间以分号隔开,比如"127.0.0.2:9876;127.0.0.3:9876"。
  3. 第三步是构建消息。指定topic、tag、body等信息,tag可以理解成标签,对消息进行再归类,RocketMQ可以在消费端对tag进行过滤。
  4. 最后调用send接口将消息发送出去。同步发送等待结果最后返回SendResult,SendResut包含实际发送状态还包括SEND_OK(发送成功),FLUSH_DISK_TIMEOUT(刷盘超时), FLUSH_SLAVE_TIMEOUT(同步到备超时),
    SLAVE_NOT_AVAILABLE(备不可用),如果发送失败会抛出异常。
    /**
     * 发送同步消息
     * 消息发送方发出一条消息后,会在收到服务端同步响应之后才发下一条消息的通讯方式
     * 可靠的同步传输被广泛应用于各种场景,如重要的通知消息、短消息通知等。
     */
    @PostMapping("/syncSend")
    public String syncSend(@RequestBody UserContent user) {
   
        // 发送消息前插入数据库
        // 发送消息 tags在topic之后用:拼接 自动解析
        SendResult sendResult = rocketMQTemplate.syncSend(syncTopic + ":" + syncTag, JSONObject.toJSONString(user));
        System.out.printf("同步发送字符串%s,发送结果:%s", user.toString(), sendResult);
        // 发送消息后插入数据库
        // 解析发送结果
//        if (sendResult.getSendStatus() == SendStatus.SEND_OK) {
   
//            response = sendResult.getMsgId() + " : " + sendResult.getSendStatus();
//        }
        return sendResult.getSendStatus().toString();
    }

DefaultMQProducer 方式发送

public class SyncProducer {
   
  public static void main(String[] args) throws Exception {
   
    // 初始化一个producer并设置Producer group name
    DefaultMQProducer producer = new DefaultMQProducer("sync_group"); //(1)
    // 设置NameServer地址
    producer.setNamesrvAddr("localhost:9876");  //(2)
    // 启动producer
    producer.start();
    for (int i = 0; i < 100; i++) {
   
      // 创建一条消息,并指定topic、tag、body等信息,tag可以理解成标签,对消息进行再归类,RocketMQ可以在消费端对tag进行过滤
      Message msg = new Message("sync_topic" /* Topic */,
        "TagA" /* Tag */,
        ("Hello RocketMQ " + i).getBytes(RemotingHelper.DEFAULT_CHARSET) /* Message body */
        );   //(3)
      // 利用producer进行发送,并同步等待发送结果
      SendResult sendResult = producer.send(msg);   //(4)
      System.out.printf("%s%n", sendResult);
    }
    // 一旦producer不再使用,关闭producer
    producer.shutdown();
  }
}

同步发送方式请务必捕获发送异常,并做业务侧失败兜底逻辑,如果忽略异常则可能会导致消息未成功发送的情况。

1.2 异步发送

异步发送是指发送方发出一条消息后,不等服务端返回响应,接着发送下一条消息的通讯方式。
在这里插入图片描述

异步发送需要实现异步发送回调接口(SendCallback)。

消息发送方在发送了一条消息后,不需要等待服务端响应即可发送第二条消息,发送方通过回调接口接收服务端响应,并处理响应结果。异步发送一般用于链路耗时较长,对响应时间较为敏感的业务场景。例如,视频上传后通知启动转码服务,转码完成后通知推送转码结果等。

RocketMQTemplate方式发送

    /**
     * 异步发送
     * 发送方发出一条消息后,不等服务端返回响应,接着发送下一条消息
     */
    @PostMapping("asyncSend")
    public void asyncSend(@RequestBody UserContent user) {
   
        System.out.printf("async send begin %s%n", LocalDateTime.now());
        rocketMQTemplate.asyncSend("shen-asyncSend:TagAsync", JSONObject.toJSONString(user), new SendCallback() 
  • 3
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值