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

相关推荐
Ethan01072 天前
RocketMQ三高-高性能、高并发、高可靠
rocketmq
qiu_lovejun9989 天前
linux安装docker和redis和rabbitmq和nginx和rocketmq和kafka
linux·redis·docker·kafka·rabbitmq·rocketmq
豆瓣鸡10 天前
RocketMQ学习-Spring Boot消息实践
java·spring boot·rocketmq
阿里云云原生10 天前
从传统漏桶到分布式矩阵:RocketMQ LiteTopic 如何支撑百炼网关的百万级流量治理?
rocketmq
大E帝国子民113 天前
Docker 部署 RocketMQ 5
docker·容器·rocketmq
孫治AllenSun13 天前
【RocketMQ】Mac安装
macos·rocketmq
Rain的Java大神实战圈13 天前
订单超时如何自动取消
消息队列·rabbitmq·高并发·架构设计
佛祖让我来巡山14 天前
消息中间件入门认知:从0开始认识消息队列与RocketMQ
rocketmq·认识rocketmq
霸道流氓气质14 天前
基于阿里云RocketMQ封装库的集成技术示例
阿里云·云计算·rocketmq
Rain的Java大神实战圈14 天前
高并发下如何防止商品超卖少卖
经验分享·redis·高并发·架构设计·电商·面试经验