說來也奇怪,RocketMQ 不能很好的兼容Springboot3,剛開始上手Springboot3集成RocketMQ會發現總是不能實例化RocketMQTemplate,老是啟動時報錯。本項目采用Springboot3,JDK21 ,Maven 3.9,提供一個非常簡單的示例。
案例就只有這5個類,沒有建package。
提前工作
我的RocketMQ服務部署在虛擬機Linux服務器,ip地址是 192.168.218.128
,Linux部署RocketMQ比較簡單。
運行Springboot3項目之前,需要先把Linux中 mqnamesrv
和mqbroker
兩個服務啟動起來。
引入依賴
注意rocketmq-spring-boot-starter版本 2.3.1 不要改動,目前2.3.1版本可以兼容5.3.1,其他版本可能出現注入IOC容器失敗。
<dependency><groupId>org.apache.rocketmq</groupId><artifactId>rocketmq-spring-boot-starter</artifactId><version>2.3.1</version></dependency><dependency><groupId>org.apache.rocketmq</groupId><artifactId>rocketmq-client</artifactId><version>5.3.1</version></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId></dependency>
yaml中添加RocketMQ配置信息
配置類 application.yaml
,注意rocketmq
標簽不是 spring
標簽的子標簽,二者是并立的。配置文件就這些內容。
spring:application:name: rocketmq-demorocketmq:name-server: 192.168.218.128:9876# 必須初始化生產者,才會實例化RocketMQTemplateproducer:group: producer-groupconsumer:group: consumer-group// 配置后端服務端口是8081
server:port: 8081
建立配置類
手動配置RocketMQConfig
注入:配置 RocketMQ 消息中間件的相關參數,并通過 Spring 的依賴注入機制將其集成到 Spring Boot 應用程序中。
@Configuration
public class RocketMQConfig {@Value("${rocketmq.name-server}")private String nameServer;@Value("${rocketmq.producer.group}")private String producerGroup;@Beanpublic RocketMQTemplate rocketMQTemplate() {RocketMQTemplate rocketMQTemplate = new RocketMQTemplate();DefaultMQProducer defaultMQProducer = new DefaultMQProducer();defaultMQProducer.setProducerGroup(producerGroup);defaultMQProducer.setNamesrvAddr(nameServer);rocketMQTemplate.setProducer(defaultMQProducer);return rocketMQTemplate;}
}
創建生產者
import org.apache.rocketmq.spring.core.RocketMQTemplate;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;/*** @author 10463*/
@Service
public class RocketMQProducer {@Autowiredprivate RocketMQTemplate rocketMQTemplate;public void sendMessage(String topic, String message) {rocketMQTemplate.convertAndSend(topic, message);}
}
創建消費者
import org.apache.rocketmq.spring.annotation.RocketMQMessageListener;
import org.apache.rocketmq.spring.core.RocketMQListener;
import org.springframework.stereotype.Component;
import org.springframework.stereotype.Service;/*** @author 10463*/
@Component
@Service
@RocketMQMessageListener(topic = "test-topic", consumerGroup = "consumer-group")
public class RocketMQConsumer implements RocketMQListener<String> {@Overridepublic void onMessage(String message) {System.out.println("消費者收到 message: " + message);}
}
創建控制類
@Controller
public class MessageController {@Autowiredprivate RocketMQProducer rocketMQProducer;@GetMapping("/sendMessage")public String sendMessage(@RequestParam(value = "message", required = true) String message) {System.out.println("進入方法");rocketMQProducer.sendMessage("test-topic", message);return "消息發送成功";}
}
測試
啟動Application
類,代碼如下,我沒有添加任何額外注解:
@SpringBootApplication
public class MqServiceApplication {public static void main(String[] args) {SpringApplication.run(MqServiceApplication.class, args);}
}
使用postMan ,執行GET 請求模擬:
http://localhost:8081/sendMessage?message=HelloRocketMQ
沒有postman也沒關系,直接在網址中復制回車。
如果部署沒問題,在控制臺會輸出
進入方法
消費者收到 message: HelloRocketMQ
該案例沒有任何復雜注解和層級關系,部署成功后可以進行后續的復雜RocketMQ學習。