部署Rocket首先要部署一个 NameServer
相关介绍参考: https://www.jianshu.com/p/3d8d594d9161
rocket 部署: docker部署
docker-compose
version: "3.7"
# https://github.com/apache/rocketmq-docker
services:
namesrv:
image: apacherocketmq/rocketmq:4.5.0
container_name: namesrv
ports:
- 9876:9876
volumes:
- ./data/namesrv/logs:/home/rocketmq/logs
command: sh mqnamesrv
mqbroker:
image: apacherocketmq/rocketmq:4.5.0
container_name: mqbroker
ports:
- 10909:10909
- 10911:10911
- 10912:10912
volumes:
- ./data/broker/logs:/home/rocketmq/logs
- ./data/broker/store:/home/rocketmq/store
- ./data/broker/conf/broker.conf:/home/rocketmq/rocketmq-4.5.0/conf/broker.conf
command: sh mqbroker -n namesrv:9876 -c ../conf/broker.conf
depends_on:
- namesrv
broker.conf
brokerClusterName = DefaultCluster
brokerName = broker-a
brokerId = 0
deleteWhen = 04
fileReservedTime = 48
brokerRole = ASYNC_MASTER
flushDiskType = ASYNC_FLUSH
#set `brokerIP1` if you want to set physical IP as broker IP.
#change you own physical IP Address
brokerIP1 = localhost
# listenPort = 28081
namesrvAddr= localhost:9876
autoCreateTopicEnable=true
然后就是项目文件
消息生产者架构:
pom.xml 文件(生产者和消费者用同一个pom文件)
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.3.2.RELEASE</version>
<relativePath/> <!-- lookup parent from repository -->
</parent>
<groupId>com.demo.springcloud_06_rocketmq</groupId>
<artifactId>mq_producer</artifactId>
<version>0.0.1-SNAPSHOT</version>
<name>mq_producer</name>
<description>生产者</description>
<properties>
<spring.cloud.version>Hoxton.SR9</spring.cloud.version>
<spring.boot.version>2.3.2.RELEASE</spring.boot.version>
<spring.cloud.alibaba.version>2.2.6.RELEASE</spring.cloud.alibaba.version>
</properties>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<version>1.18.0</version>
<optional>true</optional>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-actuator</artifactId>
</dependency>
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-stream-rocketmq</artifactId>
</dependency>
</dependencies>
<dependencyManagement>
<dependencies>
<!--spring-boot-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-dependencies</artifactId>
<version>${spring.boot.version}</version>
<type>pom</type>
<scope>import</scope>
</dependency>
<!-- spring-cloud -->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-dependencies</artifactId>
<version>${spring.cloud.version}</version>
<type>pom</type>
<scope>import</scope>
</dependency>
<!-- spring-cloud-alibaba -->
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-alibaba-dependencies</artifactId>
<version>${spring.cloud.alibaba.version}</version>
<type>pom</type>
<scope>import</scope>
</dependency>
</dependencies>
</dependencyManagement>
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
</plugins>
</build>
</project>
生产者配置文件
application.yml
server:
port: 8062
spring:
cloud:
stream:
bindings:
topic_channel:
destination: TOPIC_CHANNEL_0
content-type: application/json
# group: topic_group
rocketmq:
binder:
name-server: localhost:9876 #,localhost:9877
bindings:
topic_channel:
producer:
group: topic_group # 生产者分组
# sync: true # 是否同步发送消息,默认为 false 异步。
MqProducerApplication,java
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.stream.annotation.EnableBinding;
import com.demo.springcloud_06_rocketmq.mq_producer.producer.ProducerChannel;
@SpringBootApplication
@EnableBinding(ProducerChannel.class)
public class MqProducerApplication {
public static void main(String[] args) {
SpringApplication.run(MqProducerApplication.class, args);
}
}
ProducerController.java
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;
@Slf4j
@RestController
public class ProducerController {
@Autowired
private MessageSender sender;
@GetMapping("/send")
public void testKafkaMessageSend(String message) {
log.info("message:{}",message);
sender.sendToTopicChannel(message);
}
}
ProducerChannel.java
import org.springframework.cloud.stream.annotation.Output;
import org.springframework.messaging.MessageChannel;
public interface ProducerChannel {
/**
* 缺省发送消息通道名称
*/
String TOPIC_CHANNEL = "topic_channel";
/**
* 缺省发送消息通道
* @return channel 返回缺省信息发送通道
*/
@Output(TOPIC_CHANNEL)
MessageChannel sendTopicChannelMessage();
}
MessageSender.java
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.messaging.support.MessageBuilder;
import org.springframework.stereotype.Component;
@Slf4j
@Component
public class MessageSender {
@Autowired
private ProducerChannel channel;
/**
* 消息发送到默认通道:缺省通道对应缺省主题
*
* @param message
*/
public void sendToTopicChannel(String message) {
channel.sendTopicChannelMessage().send(MessageBuilder.withPayload(message).build());
}
}
消息消费者项目架构:
pom.xml文件 同上
application.yml 文件如下
server:
port: 8063
spring:
application:
name: mq_consumer
cloud:
stream:
bindings:
topic_channel:
destination: TOPIC_CHANNEL_0
content-type: application/json
group: topic_group_1
rocketmq:
binder:
name-server: localhost:9876
bindings:
topic_channel:
consumer:
enabled: true # 是否开启消费,默认为 true
broadcasting: false # 是否使用广播消费,默认为 false 使用集群消费
MqConsumerApplication.java
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.stream.annotation.EnableBinding;
import com.demo.springcloud_06_rocketmq.mq_consumer.consumer.ConsumerChannel;
@SpringBootApplication
@EnableBinding(ConsumerChannel.class)
public class MqConsumerApplication {
public static void main(String[] args) {
SpringApplication.run(MqConsumerApplication.class, args);
}
}
ConsumerListener.java
import lombok.extern.slf4j.Slf4j;
import org.springframework.cloud.stream.annotation.StreamListener;
import org.springframework.messaging.Message;
import org.springframework.messaging.handler.annotation.Payload;
import org.springframework.stereotype.Component;
import java.util.Date;
@Slf4j
@Component
public class ConsumerListener {
/**
* 从缺省通道接收消息
* @param message
*/
@StreamListener(ConsumerChannel.TOPIC_CHANNEL)
public void receive(@Payload Message<String> message){
log.info("{}订阅缺省消息:通道 = {},data = {}", new Date(),"topic_channel", message);
log.info("接收数据: {}",message.getPayload());
}
}
ConsumerChannel.java
import org.springframework.cloud.stream.annotation.Input;
import org.springframework.messaging.SubscribableChannel;
public interface ConsumerChannel {
String TOPIC_CHANNEL = "topic_channel";
@Input(TOPIC_CHANNEL)
SubscribableChannel demo01Input();
}
mq的坑点主要在mq服务器的搭建上,如果配置不正确,消息服务器启动成功,但是接收和发送还会出问题,常见的就是发送成功,但是无法接收