Rocketmq 结合springboot的使用

1: 准备

1:启动一个 rocketmq 的服务,我还是用上次搭建的那个 基于 DLedger的主备切换集群
2:启动 rocketmq 的 console 端,便于浏览器查看
3:IDEA
1,2 我都不说了,下面只陈述 代码的编写方面 ,我采用一个服务来发送和监听处理

2:创建 一个 Spring boot 服务,书写代码

首先,pom 文件中引入 rocketmq-client 和 rocketmq-common 的 dependence

        <!-- rocketmq 客户端依赖-->
        <dependency>
            <groupId>org.apache.rocketmq</groupId>
            <artifactId>rocketmq-client</artifactId>
            <version>4.7.1</version>
        </dependency>

        <!-- rocketmq common -->
        <dependency>
            <groupId>org.apache.rocketmq</groupId>
            <artifactId>rocketmq-common</artifactId>
            <version>4.7.1</version>
        </dependency>

在这里插入图片描述

2.1:Procuder 端-制造消息

向 broker 端发送消息

2.1.1:配置文件

## 服务名称
spring.application.name=rocketmq
## 端口号
server.port=8081

## rocketmq 的 nameServer 
rocketmq.namesrvAddr=192.168.10.151:9876
## rocketmq 的 topic
rocketmq.topic=topic111
## 使用服务名称作为创建 DefaultMQProducer 中的 group
rocketmq.groupName=${spring.application.name}

在这里插入图片描述

2.1.2:配置类

创建一个DefaultMQProducer 配置类,我这边取名 ProcuderConfig

package com.jqk.springboot.config;

import lombok.extern.log4j.Log4j2;
import org.apache.rocketmq.client.exception.MQClientException;
import org.apache.rocketmq.client.producer.DefaultMQProducer;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

/**
 * @Author:jqk
 * @Date:2022/2/16 17:27
 * DefaultMQProducer 配置类
 **/
@Configuration
@Log4j2(topic = "ProcuderConfig")
public class ProcuderConfig {

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

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

    @Bean
    public DefaultMQProducer createDefaultMQProducer() {
        DefaultMQProducer producer = new DefaultMQProducer(this.groupName);
        producer.setNamesrvAddr(this.namesrvAddr);
        try {
            producer.start();
            log.debug(String.format("producer is start ! groupName:[%s],namesrvAddr:[%s]", groupName, namesrvAddr));
        } catch (MQClientException e) {
            log.debug(String.format("producer is error {}", e.getMessage(), e));
        }
        return producer;
    }

}

在这里插入图片描述

2.1.3: controller 类

创建 一个 controller 类,我这边取名 ProcuderController

package com.jqk.springboot.controller;

import lombok.extern.log4j.Log4j2;
import org.apache.rocketmq.client.producer.DefaultMQProducer;
import org.apache.rocketmq.common.message.Message;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;

/**
 * @Author:jqk
 * @Date:2022/2/16 17:09
 **/
@RestController
@Log4j2(topic = "ProcuderController")
public class ProcuderController {

    /**
     * 不能发一次消息,换一次 group ,因此 DefaultMQProducer 需要注入 ,主要作用是说明 procuder 的身份
     */
    @Autowired
    private DefaultMQProducer defaultMQProducer;

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

    @GetMapping("/send-message")
    public String sendMessage() {

        for (int i = 0; i < 1; i++) {
            Message message = new Message(this.topic, "springboot 整合 rocketmq 发送的消息".getBytes());
            try {
                defaultMQProducer.send(message);
            } catch (Exception e) {
                log.debug(String.format("producer is error {}", e.getMessage(), e));
            }
        }
        return "OK";
    }

}

在这里插入图片描述

2.2:Consumer 端-消费消息

上面我们生产了一条消息,但是我们还没有消费,现在我们编写消费端的代码,向 broker 拉取消息

2.2.1:配置文件(和 Procuder 一样)

我这个是在一个服务中,如果想采用两个服务,需要分别配置

## 服务名称
spring.application.name=rocketmq
## 端口号
server.port=8081

## rocketmq 的 nameServer 
rocketmq.namesrvAddr=192.168.10.151:9876
## rocketmq 的 topic
rocketmq.topic=topic111
## 使用服务名称作为创建 DefaultMQProducer 中的 group
rocketmq.groupName=${spring.application.name}

在这里插入图片描述

2.2.2:监听消息类

取名 叫 ConsumerConfig

package com.jqk.springboot.config;

import lombok.extern.log4j.Log4j2;
import org.apache.rocketmq.client.consumer.DefaultMQPushConsumer;
import org.apache.rocketmq.client.consumer.listener.ConsumeConcurrentlyContext;
import org.apache.rocketmq.client.consumer.listener.ConsumeConcurrentlyStatus;
import org.apache.rocketmq.client.consumer.listener.MessageListenerConcurrently;
import org.apache.rocketmq.common.message.MessageExt;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

import java.util.List;

/**
 * @Author:jqk
 * @Date:2022/2/16 17:43
 **/

@Configuration
@Log4j2(topic = "ConsumerConfig")
public class ConsumerConfig {

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

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

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

    @Bean
    public DefaultMQPushConsumer getRocketMQConsumer() throws Exception {
        DefaultMQPushConsumer consumer = new DefaultMQPushConsumer(groupName);
        consumer.setNamesrvAddr(namesrvAddr);
        consumer.subscribe(this.topic, "*");
        consumer.registerMessageListener(new MessageListenerConcurrently() {
            @Override
            public ConsumeConcurrentlyStatus consumeMessage(List<MessageExt> msgs, ConsumeConcurrentlyContext context) {
                for (MessageExt msg : msgs) {
                    System.out.println("message body:" + new String(msg.getBody()));
                }
                return ConsumeConcurrentlyStatus.CONSUME_SUCCESS;
            }
        });
        consumer.start();
        return consumer;
    }
}

在这里插入图片描述

2.3:启动服务,测试功能

2.3.1:调用接口,发送消息

我们启动 springboot 服务,浏览器调用 http://localhost:8081/send-message ,我这边采用 IDEA 插件 RestFulTool 来调用。

在这里插入图片描述
可以看到两个信息:一个消息发送成功,二是消息消费成功

2.3.2:通过 rocketmq console 查看消息情况

浏览器访问,查看 message
在这里插入图片描述
我们具体查看这条消息
在这里插入图片描述

3:写在末尾

上面是在一个服务中使用了 rocketmq,分别展示 发消息 和 收消息,我们平时使用 rocketmq 的场景 一般是在多服务下,可以根据自己是收消息还是发消息进行代码编写。

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值