文章目录
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 的场景 一般是在多服务下,可以根据自己是收消息还是发消息进行代码编写。