diff --git a/lab-39/lab-39-elasticsearch-jest/src/main/java/cn/iocoder/springboot/lab39/skywalkingdemo/controller/DemoController.java b/lab-39/lab-39-elasticsearch-jest/src/main/java/cn/iocoder/springboot/lab39/skywalkingdemo/controller/DemoController.java
index b35ab07e..70a104c7 100644
--- a/lab-39/lab-39-elasticsearch-jest/src/main/java/cn/iocoder/springboot/lab39/skywalkingdemo/controller/DemoController.java
+++ b/lab-39/lab-39-elasticsearch-jest/src/main/java/cn/iocoder/springboot/lab39/skywalkingdemo/controller/DemoController.java
@@ -11,7 +11,7 @@ import java.util.Date;
@RestController
@RequestMapping("/demo")
- public class DemoController {
+public class DemoController {
@Autowired
private ESUserRepository userRepository;
diff --git a/lab-39/lab-39-rocketmq/pom.xml b/lab-39/lab-39-rocketmq/pom.xml
new file mode 100644
index 00000000..2453cd92
--- /dev/null
+++ b/lab-39/lab-39-rocketmq/pom.xml
@@ -0,0 +1,30 @@
+
+
+
+ org.springframework.boot
+ spring-boot-starter-parent
+ 2.2.1.RELEASE
+
+
+ 4.0.0
+
+ lab-39-rocketmq
+
+
+
+
+ org.springframework.boot
+ spring-boot-starter-web
+
+
+
+
+ org.apache.rocketmq
+ rocketmq-spring-boot-starter
+ 2.0.4
+
+
+
+
diff --git a/lab-39/lab-39-rocketmq/src/main/java/cn/iocoder/springboot/lab39/skywalkingdemo/rocketmqdemo/RocketMQApplication.java b/lab-39/lab-39-rocketmq/src/main/java/cn/iocoder/springboot/lab39/skywalkingdemo/rocketmqdemo/RocketMQApplication.java
new file mode 100644
index 00000000..bacf6f20
--- /dev/null
+++ b/lab-39/lab-39-rocketmq/src/main/java/cn/iocoder/springboot/lab39/skywalkingdemo/rocketmqdemo/RocketMQApplication.java
@@ -0,0 +1,13 @@
+package cn.iocoder.springboot.lab39.skywalkingdemo.rocketmqdemo;
+
+import org.springframework.boot.SpringApplication;
+import org.springframework.boot.autoconfigure.SpringBootApplication;
+
+@SpringBootApplication
+public class RocketMQApplication {
+
+ public static void main(String[] args) {
+ SpringApplication.run(RocketMQApplication.class, args);
+ }
+
+}
diff --git a/lab-39/lab-39-rocketmq/src/main/java/cn/iocoder/springboot/lab39/skywalkingdemo/rocketmqdemo/consumer/DemoConsumer.java b/lab-39/lab-39-rocketmq/src/main/java/cn/iocoder/springboot/lab39/skywalkingdemo/rocketmqdemo/consumer/DemoConsumer.java
new file mode 100644
index 00000000..6bac4b83
--- /dev/null
+++ b/lab-39/lab-39-rocketmq/src/main/java/cn/iocoder/springboot/lab39/skywalkingdemo/rocketmqdemo/consumer/DemoConsumer.java
@@ -0,0 +1,24 @@
+package cn.iocoder.springboot.lab39.skywalkingdemo.rocketmqdemo.consumer;
+
+import cn.iocoder.springboot.lab39.skywalkingdemo.rocketmqdemo.message.DemoMessage;
+import org.apache.rocketmq.spring.annotation.RocketMQMessageListener;
+import org.apache.rocketmq.spring.core.RocketMQListener;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.springframework.stereotype.Component;
+
+@Component
+@RocketMQMessageListener(
+ topic = DemoMessage.TOPIC,
+ consumerGroup = "demo-consumer-group-" + DemoMessage.TOPIC
+)
+public class DemoConsumer implements RocketMQListener {
+
+ private Logger logger = LoggerFactory.getLogger(getClass());
+
+ @Override
+ public void onMessage(DemoMessage message) {
+ logger.info("[onMessage][线程编号:{} 消息内容:{}]", Thread.currentThread().getId(), message);
+ }
+
+}
diff --git a/lab-39/lab-39-rocketmq/src/main/java/cn/iocoder/springboot/lab39/skywalkingdemo/rocketmqdemo/controller/DemoController.java b/lab-39/lab-39-rocketmq/src/main/java/cn/iocoder/springboot/lab39/skywalkingdemo/rocketmqdemo/controller/DemoController.java
new file mode 100644
index 00000000..ac72f9f9
--- /dev/null
+++ b/lab-39/lab-39-rocketmq/src/main/java/cn/iocoder/springboot/lab39/skywalkingdemo/rocketmqdemo/controller/DemoController.java
@@ -0,0 +1,26 @@
+package cn.iocoder.springboot.lab39.skywalkingdemo.rocketmqdemo.controller;
+
+import cn.iocoder.springboot.lab39.skywalkingdemo.rocketmqdemo.producer.DemoProducer;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.GetMapping;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RestController;
+
+@RestController
+@RequestMapping("/demo")
+public class DemoController {
+
+ @Autowired
+ private DemoProducer producer;
+
+ @GetMapping("/rocketmq")
+ public String echo() {
+ this.sendMessage(1);
+ return "rocketmq";
+ }
+
+ public void sendMessage(Integer id) {
+ producer.syncSend(id);
+ }
+
+}
diff --git a/lab-39/lab-39-rocketmq/src/main/java/cn/iocoder/springboot/lab39/skywalkingdemo/rocketmqdemo/message/DemoMessage.java b/lab-39/lab-39-rocketmq/src/main/java/cn/iocoder/springboot/lab39/skywalkingdemo/rocketmqdemo/message/DemoMessage.java
new file mode 100644
index 00000000..5d9e0991
--- /dev/null
+++ b/lab-39/lab-39-rocketmq/src/main/java/cn/iocoder/springboot/lab39/skywalkingdemo/rocketmqdemo/message/DemoMessage.java
@@ -0,0 +1,31 @@
+package cn.iocoder.springboot.lab39.skywalkingdemo.rocketmqdemo.message;
+
+/**
+ * 示例的 Message 消息
+ */
+public class DemoMessage {
+
+ public static final String TOPIC = "DEMO";
+
+ /**
+ * 编号
+ */
+ private Integer id;
+
+ public DemoMessage setId(Integer id) {
+ this.id = id;
+ return this;
+ }
+
+ public Integer getId() {
+ return id;
+ }
+
+ @Override
+ public String toString() {
+ return "DemoMessage{" +
+ "id=" + id +
+ '}';
+ }
+
+}
diff --git a/lab-39/lab-39-rocketmq/src/main/java/cn/iocoder/springboot/lab39/skywalkingdemo/rocketmqdemo/producer/DemoProducer.java b/lab-39/lab-39-rocketmq/src/main/java/cn/iocoder/springboot/lab39/skywalkingdemo/rocketmqdemo/producer/DemoProducer.java
new file mode 100644
index 00000000..2c8d58f7
--- /dev/null
+++ b/lab-39/lab-39-rocketmq/src/main/java/cn/iocoder/springboot/lab39/skywalkingdemo/rocketmqdemo/producer/DemoProducer.java
@@ -0,0 +1,23 @@
+package cn.iocoder.springboot.lab39.skywalkingdemo.rocketmqdemo.producer;
+
+import cn.iocoder.springboot.lab39.skywalkingdemo.rocketmqdemo.message.DemoMessage;
+import org.apache.rocketmq.client.producer.SendResult;
+import org.apache.rocketmq.spring.core.RocketMQTemplate;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Component;
+
+@Component
+public class DemoProducer {
+
+ @Autowired
+ private RocketMQTemplate rocketMQTemplate;
+
+ public SendResult syncSend(Integer id) {
+ // 创建 DemoMessage 消息
+ DemoMessage message = new DemoMessage();
+ message.setId(id);
+ // 同步发送消息
+ return rocketMQTemplate.syncSend(DemoMessage.TOPIC, message);
+ }
+
+}
diff --git a/lab-39/lab-39-rocketmq/src/main/resources/application.yaml b/lab-39/lab-39-rocketmq/src/main/resources/application.yaml
new file mode 100644
index 00000000..a0314e9e
--- /dev/null
+++ b/lab-39/lab-39-rocketmq/src/main/resources/application.yaml
@@ -0,0 +1,10 @@
+server:
+ port: 8079
+
+# rocketmq 配置项,对应 RocketMQProperties 配置类
+rocketmq:
+ name-server: 127.0.0.1:9876 # RocketMQ Namesrv
+ # Producer 配置项
+ producer:
+ group: demo-producer-group # 生产者分组
+ send-message-timeout: 3000 # 发送消息超时时间,单位:毫秒。默认为 3000 。
diff --git a/lab-39/lab-39-rocketmq/target/classes/application.yaml b/lab-39/lab-39-rocketmq/target/classes/application.yaml
new file mode 100644
index 00000000..a0314e9e
--- /dev/null
+++ b/lab-39/lab-39-rocketmq/target/classes/application.yaml
@@ -0,0 +1,10 @@
+server:
+ port: 8079
+
+# rocketmq 配置项,对应 RocketMQProperties 配置类
+rocketmq:
+ name-server: 127.0.0.1:9876 # RocketMQ Namesrv
+ # Producer 配置项
+ producer:
+ group: demo-producer-group # 生产者分组
+ send-message-timeout: 3000 # 发送消息超时时间,单位:毫秒。默认为 3000 。
diff --git a/lab-39/pom.xml b/lab-39/pom.xml
index ea421d92..25477c12 100644
--- a/lab-39/pom.xml
+++ b/lab-39/pom.xml
@@ -19,6 +19,7 @@
lab-39-mongodb
lab-39-elasticsearch
lab-39-elasticsearch-jest
+ lab-39-rocketmq