【简约入门】Springboot+RocketMQ

572 阅读3分钟

持续创作,加速成长!这是我参与「掘金日新计划 · 6 月更文挑战」的第2天,点击查看活动详情

概述

RocketMQ是分布式消息队列,使用java开发。特点是高性能、低延时和高可靠。通过配置可保证消息不丢失,类似kafka,是分布式消息队列,能持久化保存数据到磁盘中。

最新版的RocketMqSpringBoot2.X进行整合可以利用rocketmq-spring-boot-starter来简化配置,

maven依赖

首先引入maven依赖,rocketmq的starter

<dependency>
    <groupId>org.apache.rocketmq</groupId>
    <artifactId>rocketmq-spring-boot-starter</artifactId>
    <version>2.0.3</version>
</dependency>

配置文件

添加如下配置文件
rocketmq:
  name-server: 127.0.0.1:9876 
  producer:
    #生产者组
    group: "producer-group"
    # 消息最大长度 默认 1024 * 4 (4M)
    max-message-size: 4096
    # 发送消息超时时间,默认 3000
    send-message-timeout: 3000
    # 发送消息失败重试次数,默认2
    retry-times-when-send-failed: 2
    retry-times-when-send-async-failed: 2
参数解释
  • name-server:配置rocketmq的地址,如果是集群用逗号分割
  • retry-times-when-send-failed:是发送失败重试次数的配置,发送失败进行重试的规则如下:
    • 如果同步模式发送失败,则轮转到下一个Broker,如果异步模式发送失败,则只会在当前Broker进行重试。这个方法的总耗时时间不超过sendMsgTimeout设置的值,默认10s。
    • 如果本身向Broker发送消息产生超时异常,就不会再重试。

生产消费实现

发送消息

springboot引入rocketmq的依赖后,可以直接使用注解@Resource声明RocketMQTemplateRocketMQTemplate就是rocketmq的代理客户端,直接使用就可以发送消息。它包含了同步(syncSend)、异步(asyncSend)发送的方法。

  • 同步消息:生产者发出一条消息后,会在收到MQ返回的ACK之后才发下一条消息。同步消息是有发送结果的。
  • 异步消息:生产者发出消息后无需等待MQ返回ACK,直接发送下一条消息。可以指定回调。
示例

一个简单发送消息的示例,代码片段如下:

@Resource
private RocketMQTemplate rocketTemplate;

public void send(MyMessageEntity message) {

    log.debug("发送msg:{}", JSON.toJSONString(message));
    final SendResult sendResult = rocketTemplate.syncSend("topic1", JSON.toJSONString(message));
}
消费消息

消费消息使用注解@RocketMQMessageListener 下面列出了常用的参数

  • consumerGroup:指定消费者组名称
  • topic:topic名称
  • selectorType:消息选择器类型,默认根据tag选择
  • selectorExpression:标签内容
注解部分源码如下:
@Target({ElementType.TYPE})
@Retention(RetentionPolicy.RUNTIME)
@Documented
public @interface RocketMQMessageListener {
    String consumerGroup();

    String topic();

    SelectorType selectorType() default SelectorType.TAG;

    String selectorExpression() default "*";
    ...
}
示例

简单消费示例代码:

MyMessageEntity为自定义的消息体。一定要加@Component注解。以便Spring扫描bean时可以将其扫描到。

@Component
@Slf4j
@RocketMQMessageListener(topic = MqListener.GROUP_NAM, consumerGroup = MqListener.GROUP_NAME, messageModel = MessageModel.BROADCASTING)
public class MqListener implements RocketMQListener<MyMessageEntity> {

    static final String GROUP_NAME = "topic1";

    @Override
    public synchronized void onMessage(MyMessageEntity message) {
        log.info("监听到消息:{}", message.toString());
        
        // 消息处理具体实现
        this.handle(message);
        
    }

小结

springboot实现RocketMQ的方式很简单,只要引入依赖,写好对应的配置即可使用。生产者通过调用RocketMQTemplate的各种方法进行发送消息,消费者通过注解@RocketMQMessageListener来消费消息,就可实现生产消费的简单通信。