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

相关推荐
IT小哥哥呀2 天前
Jenkins + Docker 打造自动化持续部署流水线
docker·微服务·自动化·jenkins·springboot·高并发·限流
亚林瓜子2 天前
Spring中的异步任务(CompletableFuture版)
java·spring boot·spring·async·future·异步
poemyang3 天前
万丈高楼平地起:从“输入-处理-输出”第一性原理,看懂系统架构的演进
高并发
xiangji3 天前
重构《手搓》TaskFactory带你更安全的起飞
线程池·异步·taskfactory
利刃大大5 天前
【高并发服务器:HTTP应用】十四、Util工具类的设计与实现
服务器·http·高并发·项目·cpp
利刃大大7 天前
【高并发服务器】十三、TcpServer服务器管理模块
服务器·高并发·项目·cpp
程序员三明治7 天前
选 Redis Stream 还是传统 MQ?队列选型全攻略(适用场景、优缺点与实践建议)
java·redis·后端·缓存·rocketmq·stream·队列
稚辉君.MCA_P8_Java8 天前
RocketMQ 是什么?它的架构是怎么样的?和 Kafka 又有什么区别?
后端·架构·kafka·kubernetes·rocketmq
JimmtButler11 天前
RocketMQ本地编译
后端·rocketmq
JimmtButler11 天前
Namesrv解析
后端·rocketmq