SpringBoot整合RabbitMQ 通俗易懂 超詳細 【內含案例】
SpringBoot結合RabbitMq
一、SpringBoot 框架部署
1.建立Maven工程(我用的IDEA)
File[檔案] -> New[新建] -> Project[工程] -> Maven[選擇Maven] -> Next[直接下一步] -> Name[輸入專案名稱] —> Finish[完成]
2.在專案裡建立兩個子工程
Producer 訊息生產者
專案名稱位置右鍵 -> New[新建] -> Module[元件] -> Maven[選擇Maven] -> Next[下一步] -> Name[輸入Producer] —> Finish[完成]
Consumer 訊息消費者
專案名稱位置右鍵 -> New[新建] -> Module[元件] -> Maven[選擇Maven] -> Next[下一步] -> Name[輸入Consumer] —> Finish[完成]
3.在主專案工程的pom檔案裡填寫依賴(注意是主專案 兩個子專案會繼承父專案的依賴)
<!--Spring Boot依賴--> <parent> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-parent</artifactId> <version>2.2.8.RELEASE</version> </parent> <dependencies> <!--spring-boot-starter-amqp依賴 [重要]--> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-amqp</artifactId> <version>2.2.8.RELEASE</version> </dependency> <!--下面三個依賴是為了方便控制檯輸出Log [一般]--> <!--junit:junit 單元測試框架 用了都說好--> <dependency> <groupId>junit</groupId> <artifactId>junit</artifactId> <version>4.13</version> </dependency> <!--org.projectlombok:lombok 整合註解--> <dependency> <groupId>org.projectlombok</groupId> <artifactId>lombok</artifactId> <version>1.18.12</version> </dependency> <!--ch.qos.logback:logback-classic 日誌框架--> <dependency> <groupId>ch.qos.logback</groupId> <artifactId>logback-classic</artifactId> <version>1.2.3</version> </dependency> <!--spring-boot-starter-test SpringBootTest--> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-test</artifactId> <version>2.2.8.RELEASE</version> </dependency> </dependencies>
4.分別在兩個子專案中建立application.yml檔案
注意.yml檔案需下載 YAML 外掛
resource資料夾右鍵 -> New[新建] -> File[檔案] -> Name[輸入application.yml] —> Finish[完成]
spring: rabbitmq: host: localhost port: 5672 virtual-host: / username: username 改成你自己的賬號 password: password 改成你自己的密碼 server: port: 伺服器埠號 兩個子工程不能一致
5.Producer生產者建立啟動類
Java資料夾右鍵 -> New[新建] -> Java Class[類檔案] -> Name[com.rabbit.producer.ProviderRabbitApplication.java] —> Finish[完成]
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
/**
* 生產者啟動類
*/
@SpringBootApplication
public class ProviderRabbitApplication {
public static void main(String[] args) {
SpringApplication.run(ProviderRabbitApplication.class,args);
}
}
6.Consumer生產者建立啟動類
Java資料夾右鍵 -> New[新建] -> Java Class[類檔案] -> Name[com.rabbit.consumer.ConsumerRabbitMqApplication.java] —> Finish[完成]
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
/**
* 消費者啟動類
*/
@SpringBootApplication
public class ConsumerRabbitMqApplication {
public static void main(String[] args) {
SpringApplication.run(ConsumerRabbitMqApplication.class,args);
}
}
二、HelloWorld 簡單模式
1.建立RabbitMqConfig.java檔案 繫結交換機和佇列
Java資料夾右鍵 -> New[新建] -> Java Class[類檔案] -> Name[com.rabbit.producer.config.RabbitMqConfig.java] —> Finish[完成]
import org.springframework.amqp.core.*;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
/**
* RabbitMq 配置類
*/
@Configuration
public class RabbitMqConfig {
public static final String SIMPLE_EXCHANGE_NAME = "simple_exchange";
public static final String SIMPLE_QUEUE_NAME = "simple_queue";
/**
* 建立 交換機
* @return
*/
@Bean
public Exchange simpleExchange(){
return ExchangeBuilder.topicExchange(SIMPLE_EXCHANGE_NAME).build();
}
/**
* 建立 佇列
* @return
*/
@Bean
public Queue simpleQueue(){
return QueueBuilder.durable(SIMPLE_QUEUE_NAME).build();
}
/**
* 繫結 交換機與佇列
* @param exchange
* @param queue
* @return
*/
@Bean
public Binding itemQueueExchange(@Qualifier("simpleExchange") Exchange exchange, @Qualifier("simplQueue") Queue queue){
return BindingBuilder.bind(queue).to(exchange).with("").noargs();
}
}
2.建立ConsumerListener.java監聽訊息檔案
Java資料夾右鍵 -> New[新建] -> Java Class[類檔案] -> Name[com.rabbit.cosnumer.listener.ConsumerListener.java] —> Finish[完成]
import org.springframework.amqp.rabbit.annotation.RabbitListener;
import org.springframework.stereotype.Component;
import lombok.extern.slf4j.Slf4j;
@Component
@Slf4j
public class ConsumerListener {
/**
* 監聽某個佇列的訊息
* @param message 接收到的訊息
*/
@RabbitListener(queuesToDeclare = "simple_queue")
public void myListener(String message){
//不用在手動轉UTF-8 Spring自動轉好了
log.debug("消費者接收到的訊息為:{}", message);
}
}
3.建立ProducerTest.java測試檔案
test->java資料夾右鍵 -> New[新建] -> Java Class[類檔案] -> Name[com.rabbit.producer.test.ProducerTest.java] —> Finish[完成]
import lombok.extern.slf4j.Slf4j;
import com.itheima.rabbitmq.config.RabbitMQConfig;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.amqp.rabbit.core.RabbitTemplate;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.test.context.junit4.SpringRunner;
import javax.annotation.Resource;
@RunWith(SpringRunner.class)
@SpringBootTest
@Slf4j
public class RabbitMQTest {
@Resource
private RabbitTemplate rabbitTemplate;
@Test
public void sendTest(){
rabbitTemplate.convertAndSend(RabbitMqConfig.TOPIC_EXCHANGE_NAME,"","測試 SpringBoot整合RabbitMq的普通模式");
}
}
4.測試
首先執行一次ProducerTest.java測試類 建立交換機和佇列
然後在啟動消費者監聽器
三、Topic 萬用字元模式
1.建立RabbitMqConfig.java檔案 繫結交換機和佇列
Java資料夾右鍵 -> New[新建] -> Java Class[類檔案] -> Name[com.rabbit.producer.config.RabbitMqConfig.java] —> Finish[完成]
import org.springframework.amqp.core.*;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
/**
* RabbitMq 配置類
*/
@Configuration
public class RabbitMqConfig {
private static final String TOPIC_EXCHANGE_NAME = "topic_exchange";
private static final String TOPIC_QUEUE_NAME = "topic_queue";
/**
* 建立 交換機
* @return
*/
@Bean
public Exchange itemTopicExchange(){
return ExchangeBuilder.topicExchange(TOPIC_EXCHANGE_NAME).build();
}
/**
* 建立 佇列
* @return
*/
@Bean
public Queue itemQueue(){
return QueueBuilder.durable(TOPIC_QUEUE_NAME).build();
}
/**
* 繫結 交換機與佇列
* @param exchange
* @param queue
* @return
*/
@Bean
public Binding itemQueueExchange(@Qualifier("itemTopicExchange") Exchange exchange, @Qualifier("itemQueue") Queue queue){
return BindingBuilder.bind(queue).to(exchange).with("item.#").noargs();
}
}
2.建立ConsumerListener.java監聽訊息檔案
Java資料夾右鍵 -> New[新建] -> Java Class[類檔案] -> Name[com.rabbit.cosnumer.listener.ConsumerListener01.java] —> Finish[完成]
import org.springframework.amqp.rabbit.annotation.RabbitListener;
import org.springframework.stereotype.Component;
import lombok.extern.slf4j.Slf4j;
@Component
@Slf4j
public class ConsumerListener {
/**
* 監聽某個佇列的訊息
* @param message 接收到的訊息
*/
@RabbitListener(queuesToDeclare = "topic_queue")
public void myListener(String message){
//不用在手動轉UTF-8 Spring自動轉好了
log.debug("消費者接收到的訊息為:{}", message);
}
}
3.建立ProducerTest.java測試檔案
test->java資料夾右鍵 -> New[新建] -> Java Class[類檔案] -> Name[com.rabbit.producer.test.ProducerTest.java] —> Finish[完成]
import lombok.extern.slf4j.Slf4j;
import com.itheima.rabbitmq.config.RabbitMQConfig;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.amqp.rabbit.core.RabbitTemplate;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.test.context.junit4.SpringRunner;
import javax.annotation.Resource;
@RunWith(SpringRunner.class)
@SpringBootTest
@Slf4j
public class RabbitMQTest {
@Resource
private RabbitTemplate rabbitTemplate;
@Test
public void sendTest(){
rabbitTemplate.convertAndSend(RabbitMqConfig.TOPIC_EXCHANGE_NAME,"item.insert","topic萬用字元模式,RoutingKey:item.insert");
rabbitTemplate.convertAndSend(RabbitMqConfig.TOPIC_EXCHANGE_NAME,"item.delete.yes","topic萬用字元模式,RoutingKey:item.delete.yes");
rabbitTemplate.convertAndSend(RabbitMqConfig.TOPIC_EXCHANGE_NAME,"null.null","topic萬用字元模式,RoutingKey:null.null");
}
}
4.測試
首先執行一次ProducerTest.java測試類 建立交換機和佇列
然後在啟動消費者監聽器