Springboot快速集成阿里云RocketMq

前言

随着互联网的兴起,越来越多的用户开始享受科技带来的便利,对于服务的压力也日益增大,随即便有了高并发、高性能、高可用等各种解决方案,这里主要介绍RocketMq的集成方法。(文末附源码地址)

正文

1、添加依赖

复制代码
<!-- RocketMQ依赖 -->
<dependency>
    <groupId>com.aliyun.openservices</groupId>
    <artifactId>ons-client</artifactId>
    <version>1.8.4.Final</version>
</dependency>

2、添加RocketMq配置

复制代码
## 阿里RocketMQ配置
rocketmq:
  ## 连接点地址 参考控制台实例详情
  name-server: xxx.rmq.aliyuncs.com:8080
  access-key: xxx
  secret-key: xxx
  ## 自行在阿里云控制台添加group和topic
  group: test_group
  topic: test_topic

配置类:

复制代码
@Data
@Configuration
@ConfigurationProperties(prefix = "rocketmq")
public class RocketMqConfig {

    private String nameServer;

    private String accessKey;

    private String secretKey;

    @Bean
    public Properties build() {
        Properties properties = new Properties();
        properties.setProperty(PropertyKeyConst.AccessKey, accessKey);
        properties.setProperty(PropertyKeyConst.SecretKey, secretKey);
        properties.setProperty(PropertyKeyConst.NAMESRV_ADDR, nameServer);
        return properties;
    }

}

3、生产端代码(配置+发送消息)

复制代码
    @Autowired
    RocketMqConfig rocketMqConfig;

    @Value("${rocketmq.group}")
    private String group;

    @Bean(initMethod = "start", destroyMethod = "shutdown")
    public ProducerBean buildProducer() {
        ProducerBean producer = new ProducerBean();
        //配置文件
        Properties properties = rocketMqConfig.build();
        //设置发送超时时间,单位毫秒
        properties.setProperty(PropertyKeyConst.SendMsgTimeoutMillis, "3000");
        //设置组id
        properties.setProperty(PropertyKeyConst.GROUP_ID, group);
        producer.setProperties(properties);
        return producer;
    }
复制代码
    public void sendAsyncMessage(String content, String topic) {
        Message msg = new Message();
        //设置主题和标签
        msg.setTopic(topic);
        msg.setTag("*");
        msg.setBody(content.getBytes());
        producer.sendAsync(msg, new SendAsyncMessage());
    }

4、消费端代码(配置+接收消息)

复制代码
@Configuration
public class ConsumerClient {

    @Value("${rocketmq.group}")
    private String group;
    @Value("${rocketmq.topic}")
    private String topic;

    @Autowired
    RocketMqConfig rocketMqConfig;
    @Autowired
    private MyRocketMessageListener messageListener;

    @Bean(initMethod = "start", destroyMethod = "shutdown")
    public ConsumerBean buildConsumer() {

        //消费者对象bean
        ConsumerBean consumerBean = new ConsumerBean();
        //配置文件
        Properties properties = rocketMqConfig.build();
        //设置组id
        properties.setProperty(PropertyKeyConst.GROUP_ID, group);
        //将消费者线程数固定为20个 20为默认值
//        properties.setProperty(PropertyKeyConst.ConsumeThreadNums, threadNum);
        consumerBean.setProperties(properties);

        //配置订阅关系
        Map<Subscription, MessageListener> subscriptionTable = new HashMap<>();
        //当前为订阅一个主题配置(订阅多个topic一样设置)
        Subscription subscription = new Subscription();
        subscription.setTopic(topic);
        subscription.setExpression("*");
        subscriptionTable.put(subscription, messageListener);
        consumerBean.setSubscriptionTable(subscriptionTable);
        return consumerBean;
    }
}
复制代码
@Slf4j
@Configuration
public class MyRocketMessageListener implements MessageListener {


    @Override
    public Action consume(Message message, ConsumeContext context) {

        // 业务处理逻辑
        log.info(">>>>> 【消费者】系统时间:[{}]接收消息MsgId=[{}],消息内容:{}", LocalDateTime.now(), message.getMsgID(), new String(message.getBody(), StandardCharsets.UTF_8));
        try {
            // todo 业务逻辑处理
            return Action.CommitMessage;
        } catch (Exception e) {
            //消费失败
            log.error(">>>>> 【消费者】系统时间:[{}]处理消息MsgId=[{}], 当前消费失败, 开始重试......!", LocalDateTime.now(), message.getMsgID());
            return Action.ReconsumeLater;
        }
    }
}

5、接口

复制代码
@RestController
@RequestMapping("test")
public class MqTest {

    @Value("${rocketmq.topic}")
    private String topic;

    @Autowired
    RocketMQUtil rocketMQUtil;

    @RequestMapping("mq")
    public String testMq(@RequestParam("content") String content) {
        rocketMQUtil.sendAsyncMessage(content, topic);
        return "success";
    }

}

6、测试验证

①启动项目

②调用接口

浏览器:http://localhost:8080/test/mq?content=testPush

观察后端日志:

至此,接入完成。

附:

源码地址**:** https://gitee.com/yhc910/RocketMq-Demo

相关推荐
雨中飘荡的记忆2 小时前
布式事务详解:从理论到实践(RocketMQ + Seata)
java·rocketmq
豆奶特浓63 天前
Java面试模拟:当搞笑程序员谢飞机遇到电商秒杀与AIGC客服场景
java·spring boot·微服务·面试·aigc·高并发·电商
galaxyffang5 天前
RocketMQ 为什么性能不如 Kafka?
分布式·kafka·rocketmq
一叶飘零_sweeeet5 天前
从 Kafka 到 RocketMQ:迁移实战全攻略
分布式·kafka·rocketmq
Java爱好狂.8 天前
2025全年Java面试真题总结!
java·jvm·高并发·多线程·java面试·后端开发·java八股文
一叶飘零_sweeeet8 天前
Spring Cloud Alibaba RocketMQ 实战:从底层原理到微服务落地全攻略
微服务·架构·rocketmq
一叶飘零_sweeeet9 天前
RocketMQ 核心解密:NameServer 路由发现与负载均衡的底层逻辑全解析
负载均衡·rocketmq
无心水9 天前
【分布式利器:事务】5、本地消息表vs事务消息:异步方案怎么选?
分布式·rocketmq·分布式事务·saga·事务消息·分布式利器·2pc3pc
huisheng_qaq10 天前
【RocketMq源码篇-02】rocketmq集群搭建详细过程(docker版-2主2从)
docker·rocketmq·rocketmq集群·rocketmq源码·2主2从
无心水10 天前
【分布式利器:RocketMQ】RocketMQ基本原理详解:架构、流程与核心特性(附实战场景)
中间件·架构·rocketmq·topic·rocketmq基本原理·电商金融mq·nameserver