SpringBoot 2.x 简易集成 RocketMQ

1 摘要

RocketMQ 为阿里开源的高性能消息队列,基于Java实现,支持多种开发语言,能够支撑天猫双十一,具有高可用性。本文将介绍 Springboot 2.6 简易集成 RocketMQ。

2 核心 Maven 依赖

./demo-rocketmq-producer/pom.xml
./demo-rocketmq-consumer/pom.xml
        <!-- rocketMQ -->
        <dependency>
            <groupId>org.apache.rocketmq</groupId>
            <artifactId>rocketmq-spring-boot-starter</artifactId>
            <version>${rocketmq.spring.version}</version>
        </dependency>

其中 ${rocketmq.spring.version} 的版本为 2.2.1,对应的 rocketmq-client 版本为 4.9.1

3 消息生产者-Producer

3.1 application 配置文件
./demo-rocketmq-producer/src/main/resources/application.yml
## server
server:
  port: 8750

## spring
spring:
  application:
    name: demo-rocketmq-producer

## rocketMQ
rocketmq:
  name-server: 127.0.0.1:9876
  producer:
    group: rocketmq-producer-group
    send-message-timeout: 30000
    max-message-size: 100000
3.2 消息主题定义
./demo-rocketmq-producer/src/main/java/com/ljq/demo/springboot/rocketmq/producer/common/constant/RocketMQConst.java
package com.ljq.demo.springboot.rocketmq.producer.common.constant;

/**
 * @Description: RocketMQ 常量
 * @Author: junqiang.lu
 * @Date: 2021/12/2
 */
public class RocketMQConst {

    private RocketMQConst() {
    }

    /**
     * 消息主题
     */
    public static final String TOPIC_DEMO = "rocketmq_topic_demo";
    public static final String TOPIC_CART = "rocketmq_topic_cart";

}
3.3 生产者发送消息
./demo-rocketmq-producer/src/main/java/com/ljq/demo/springboot/rocketmq/producer/common/rocketmq/RocketMQProducer.java
package com.ljq.demo.springboot.rocketmq.producer.common.rocketmq;

import com.ljq.demo.springboot.rocketmq.producer.common.constant.RocketMQConst;
import lombok.extern.slf4j.Slf4j;
import org.apache.rocketmq.spring.core.RocketMQTemplate;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;

/**
 * @Description: RocketMQ 生产者
 * @Author: junqiang.lu
 * @Date: 2021/12/2
 */
@Slf4j
@Component
public class RocketMQProducer {

    @Autowired
    private RocketMQTemplate rocketMQTemplate;

    /**
     * 向默认主题发送消息
     *
     * @param message
     */
    public void send(String message) {
        log.info("RocketMQ producer,topic:{}, message:{}", RocketMQConst.TOPIC_DEMO, message);
        rocketMQTemplate.convertAndSend(RocketMQConst.TOPIC_DEMO, message);
    }

    /**
     * 向购物车主题发送消息
     *
     * @param message
     */
    public void sendCart(String message) {
        log.info("RocketMQ producer,topic:{}, message:{}", RocketMQConst.TOPIC_CART, message);
        rocketMQTemplate.convertAndSend(RocketMQConst.TOPIC_CART, message);
    }



}
3.4 Controller 控制层与SpringBoot 启动类
./demo-rocketmq-producer/src/main/java/com/ljq/demo/springboot/rocketmq/producer/controller/RocketMQProducerController.java
package com.ljq.demo.springboot.rocketmq.producer.controller;

import com.ljq.demo.springboot.rocketmq.producer.common.rocketmq.RocketMQProducer;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

/**
 * @Description: RocketMQ 生产者控制层
 * @Author: junqiang.lu
 * @Date: 2021/12/2
 */
@Slf4j
@RestController
@RequestMapping("/api/rocketmq/producer")
public class RocketMQProducerController {

    @Autowired
    private RocketMQProducer rocketMQProducer;

    /**
     * 向默认主题发送消息
     *
     * @param message
     * @return
     */
    @GetMapping(value = "/send")
    public ResponseEntity<?> send(String message) {
        log.info("request param: {}", message);
        rocketMQProducer.send(message);
        return ResponseEntity.ok(message);
    }

    /**
     * 向购物车主题发送消息
     *
     * @param message
     * @return
     */
    @GetMapping(value = "/send/cart")
    public ResponseEntity<?> sendCart(String message) {
        log.info("request param: {}", message);
        rocketMQProducer.sendCart(message);
        return ResponseEntity.ok(message);
    }

}
./demo-rocketmq-producer/src/main/java/com/ljq/demo/springboot/rocketmq/producer/DemoRocketmqProducerApplication.java
package com.ljq.demo.springboot.rocketmq.producer;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;

/**
 * @author ls-ljq
 */
@SpringBootApplication
public class DemoRocketmqProducerApplication {

    public static void main(String[] args) {
        SpringApplication.run(DemoRocketmqProducerApplication.class, args);
    }

}

4 消费者-Consumer

4.1 application 配置文件
./demo-rocketmq-consumer/src/main/resources/application.yml
## server
server:
  port: 8751

## spring
spring:
  application:
    name: demo-rocketmq-consumer

## rocketMQ
rocketmq:
  name-server: 127.0.0.1:9876
4.2 消息主题定义
./demo-rocketmq-consumer/src/main/java/com/ljq/springboot/rocketmq/consumer/common/constant/RocketMQConst.java
package com.ljq.springboot.rocketmq.consumer.common.constant;

/**
 * @Description: RocketMQ 常量
 * @Author: junqiang.lu
 * @Date: 2021/12/2
 */
public class RocketMQConst {

    private RocketMQConst() {
    }

    /**
     * 消费者分组
     */
    public static final String GROUP_CONSUMER_DEMO = "rocketmq-consumer-group-demo";
    public static final String GROUP_CONSUMER_CART = "rocketmq-consumer-group-cart";

    /**
     * 消息主题
     */
    public static final String TOPIC_DEMO = "rocketmq_topic_demo";
    public static final String TOPIC_CART = "rocketmq_topic_cart";


}
4.3 消费者接收消息
./demo-rocketmq-consumer/src/main/java/com/ljq/springboot/rocketmq/consumer/common/rocketmq/RocketMQConsumer.java
package com.ljq.springboot.rocketmq.consumer.common.rocketmq;

import com.ljq.springboot.rocketmq.consumer.common.constant.RocketMQConst;
import lombok.extern.slf4j.Slf4j;
import org.apache.rocketmq.spring.annotation.RocketMQMessageListener;
import org.apache.rocketmq.spring.core.RocketMQListener;
import org.springframework.stereotype.Component;

/**
 * @Description: RocketMq 默认主题消费者
 * @Author: junqiang.lu
 * @Date: 2021/12/2
 */
@Slf4j
@Component
@RocketMQMessageListener(topic = RocketMQConst.TOPIC_DEMO, consumerGroup = RocketMQConst.GROUP_CONSUMER_DEMO)
public class RocketMQConsumer implements RocketMQListener<String> {


    @Override
    public void onMessage(String s) {
        log.info("rocketMQ consumer, topic:{}, message:{}", RocketMQConst.TOPIC_DEMO, s);
    }
}
./demo-rocketmq-consumer/src/main/java/com/ljq/springboot/rocketmq/consumer/common/rocketmq/RocketMQCartConsumer.java
package com.ljq.springboot.rocketmq.consumer.common.rocketmq;

import com.ljq.springboot.rocketmq.consumer.common.constant.RocketMQConst;
import lombok.extern.slf4j.Slf4j;
import org.apache.rocketmq.spring.annotation.RocketMQMessageListener;
import org.apache.rocketmq.spring.core.RocketMQListener;
import org.springframework.stereotype.Component;

/**
 * @Description: RocketMQ 购物车主题消费者
 * @Author: junqiang.lu
 * @Date: 2021/12/2
 */
@Slf4j
@Component
@RocketMQMessageListener(topic = RocketMQConst.TOPIC_CART, consumerGroup = RocketMQConst.GROUP_CONSUMER_CART)
public class RocketMQCartConsumer implements RocketMQListener<String> {


    @Override
    public void onMessage(String s) {
        log.info("rocketMQ consumer, topic:{}, message:{}", RocketMQConst.TOPIC_CART, s);
    }
}
4.4 SpringBoot 启动类
./demo-rocketmq-consumer/src/main/java/com/ljq/springboot/rocketmq/consumer/DemoRocketmqConsumerApplication.java
package com.ljq.springboot.rocketmq.consumer;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;

/**
 * @author ls-ljq
 */
@SpringBootApplication
public class DemoRocketmqConsumerApplication {

    public static void main(String[] args) {
        SpringApplication.run(DemoRocketmqConsumerApplication.class, args);
    }

}

5 消息推送测试

启动生产者和消费者服务,请求生产者消息推送的接口

GET 方式请求接口

http://127.0.0.1:8750/api/rocketmq/producer/send?message=dddemoe1638516644

生产者日志

2021-12-03 15:30:44 | INFO  | http-nio-8750-exec-1 | org.apache.catalina.core.ContainerBase.[Tomcat].[localhost].[/] 173| Initializing Spring DispatcherServlet 'dispatcherServlet'
2021-12-03 15:30:44 | INFO  | http-nio-8750-exec-1 | org.springframework.web.servlet.DispatcherServlet 525| Initializing Servlet 'dispatcherServlet'
2021-12-03 15:30:44 | INFO  | http-nio-8750-exec-1 | org.springframework.web.servlet.DispatcherServlet 547| Completed initialization in 1 ms
2021-12-03 15:30:44 | INFO  | http-nio-8750-exec-1 | com.ljq.demo.springboot.rocketmq.producer.controller.RocketMQProducerController 32| request param: dddemoe1638516644
2021-12-03 15:30:44 | INFO  | http-nio-8750-exec-1 | com.ljq.demo.springboot.rocketmq.producer.common.rocketmq.RocketMQProducer 27| RocketMQ producer,topic:rocketmq_topic_demo, message:dddemoe1638516644
2021-12-03 15:30:44 | DEBUG | http-nio-8750-exec-1 | org.apache.rocketmq.spring.core.RocketMQTemplate 561| send message cost: 132 ms, msgId:7F0000013E2818B4AAC20DA0D7340000
2021-12-03 15:30:44 | DEBUG | http-nio-8750-exec-1 | org.apache.rocketmq.spring.core.RocketMQTemplate 979| send message to `rocketmq_topic_demo` finished. result:SendResult [sendStatus=SEND_OK, msgId=7F0000013E2818B4AAC20DA0D7340000, offsetMsgId=B63D13EF00002A9F000000000000378D, messageQueue=MessageQueue [topic=rocketmq_topic_demo, brokerName=broker-a, queueId=3], queueOffset=12]

消费者日志

2021-12-03 15:30:44 | DEBUG | ConsumeMessageThread_1 | org.apache.rocketmq.spring.support.DefaultRocketMQListenerContainer 356| received msg: MessageExt [brokerName=broker-a, queueId=3, storeSize=292, queueOffset=12, sysFlag=0, bornTimestamp=1638516644660, bornHost=/local_public_ip:28745, storeTimestamp=1638516643384, storeHost=/rockmq_public_ip:10911, msgId=B63D13EF00002A9F000000000000378D, commitLogOffset=14221, bodyCRC=1003365211, reconsumeTimes=0, preparedTransactionOffset=0, toString()=Message{topic='rocketmq_topic_demo', flag=0, properties={MIN_OFFSET=0, MAX_OFFSET=13, CONSUME_START_TIME=1638516644703, id=8b0a75a5-3ae2-b625-8487-42f2a857da19, UNIQ_KEY=7F0000013E2818B4AAC20DA0D7340000, CLUSTER=DefaultCluster, contentType=text/plain;charset=UTF-8, timestamp=1638516644563}, body=[100, 100, 100, 101, 109, 111, 101, 49, 54, 51, 56, 53, 49, 54, 54, 52, 52], transactionId='null'}]
2021-12-03 15:30:44 | INFO  | ConsumeMessageThread_1 | com.ljq.springboot.rocketmq.consumer.common.rocketmq.RocketMQConsumer 22| rocketMQ consumer, topic:rocketmq_topic_demo, message:dddemoe1638516644
2021-12-03 15:30:44 | DEBUG | ConsumeMessageThread_1 | org.apache.rocketmq.spring.support.DefaultRocketMQListenerContainer 361| consume 7F0000013E2818B4AAC20DA0D7340000 cost: 1 ms

至此,已经实现了 SpringBoot 2.6 简易集成 RocketMQ 的功能

6 推荐参考资料

Apache RocketMQ with Spring Boot-Baeldung

RocketMQ-Spring 官方示例

RocketMQ踩坑记

RocketMQ-单机版安装及远程连接测试

7 Github 源码

Gtihub 源码地址 : https://github.com/Flying9001/springBootDemo

个人公众号:404Code,分享半个互联网人的技术与思考,感兴趣的可以关注.
404Code

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值