SpringBoot簡單使用RabbitMQ訊息元件
1 在虛擬機器中安裝rabbitmq 2 開啟rabbitmq 3 頁面檢視rabbitmq
3 rabbitmq相關知識點講解 [1]
MQ全稱為Message Queue, 訊息佇列(MQ)是一種應用程式對應用程式的通訊方法。MQ是消費-生產者模型的一個典型的代表,一端往訊息佇列中不斷寫入訊息,而另一端則可以讀取佇列中的訊息。
1、佇列、生產者、消費者
佇列:mq內部儲存資訊的
生產者:產生資訊的
消費者:消費訊息的
2、Exchange、Binding exchange:交換器,交換按照一定規則與對列繫結,訊息才能到queue中 Binding用routing key
3、Exchange Type有四種
RabbitMQ常用的Exchange Type有三種:fanout、direct、topic。headers不常用。
fanout:把所有傳送到該Exchange的訊息投遞到所有與它繫結的佇列中。將訊息傳送與該exchange繫結的所有的對列,不需要比較路由鍵
direct:把訊息投遞到那些binding key與routing key完全匹配的佇列中。要求路由鍵與對列名完全匹配
topic:將訊息路由到binding key與routing key模式匹配的佇列中。用#匹配0或者多個,*匹配一個
4 下面簡單實現下圖的結果
1 建立direct型別的交換器
2 建立 fanout型別的交換器
3 建立 topic型別的交換器
4 建立的結果
5 建立對列,以下圖為例子
佇列建立完成
6 繫結佇列direct型別例子
7 繫結fanout型別的例子
8 繫結topic型別的例子
9 測試direct型別的交換器
測試結果
10 測試 fanout型別的交換器
測試結果
11 測試topic 型別的交換器
5 在springBoot專案下使用RabbitMq
pom.xml
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://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.1.6.RELEASE</version>
<relativePath/> <!-- lookup parent from repository -->
</parent>
<groupId>com.mao</groupId>
<artifactId>spring-01-amqp</artifactId>
<version>0.0.1-SNAPSHOT</version>
<name>spring-01-amqp</name>
<description>Demo project for Spring Boot</description>
<properties>
<java.version>1.8</java.version>
</properties>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-amqp</artifactId>
</dependency>
<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>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
</plugins>
</build>
</project>
applicaton.properties配置
spring.rabbitmq.host=192.168.1.139
spring.datasource.password=guest
spring.datasource.username=guest
book實體
public class book {
private String bookName;
private String author;
public book(String bookName, String author) {
this.bookName = bookName;
this.author = author;
}
public book() {
}
public String getAuthor() {
return author;
}
public void setAuthor(String author) {
this.author = author;
}
public String getBookName() {
return bookName;
}
public void setBookName(String bookName) {
this.bookName = bookName;
}
[@Override](https://my.oschina.net/u/1162528)
public String toString() {
return "book{" +
"bookName='" + bookName + '\'' +
", author='" + author + '\'' +
'}';
}
}
測試傳送資料程式碼 @Test public void contextLoads() {
//message需要自己構造一個,定義訊息體內容和訊息頭
// rabbitTemplate.send(exchange,roteKey,message);
//只需要傳入要傳送的物件,自動序列化傳送給rabbitmq,物件被預設序列化後傳送
Map<String,Object> map= new HashMap<>();
map.put("msg","這是第一個訊息");
map.put("data", Arrays.asList("hello","wored","rabbitmq"));
rabbitTemplate.convertAndSend("exchange.direct","mao.news",new book("少年","天機"));
}
/**
採用廣播的方式
**/
[@Test](https://my.oschina.net/azibug)
public void senMsg(){
rabbitTemplate.convertAndSend("exchange.fanout","",new book("少年","落非"));
}
接收資料測試
//接收資料
[@Test](https://my.oschina.net/azibug)
public void receive(){
Object o=rabbitTemplate.receiveAndConvert("mao.news");
System.out.println(o.getClass());
System.out.println(o);
}
上面測試有個問題,在管理介面顯示的是序列化的資料
下面來解決該問題
下面這樣就可以以json格式顯示,與之前的一篇部落格類似,配置自定義redis配置
@Configuration
public class myamqpconfig { @Bean public MessageConverter messageConverter(){
return new Jackson2JsonMessageConverter();
}
}
使用下面的就可以收到訊息
@Service
public class BookService {
@RabbitListener(queues = "mao.news")
public void receive(book book1){
System.out.println("收到訊息:"+book1.toString());
}
自己測試相關結果