SpringBoot與訊息中介軟體(RabbitMQ)的基本使用
阿新 • • 發佈:2018-12-19
最近新的專案分配給我的任務需要用到RabbitMQ做訊息中介軟體, RabbitMQ已經忘了好多, 今天就來回顧一下RabbitMQ的基本使用(注: 不瞭解RabbitMQ的請參考: https://blog.csdn.net/w1316022737/article/details/83820050)
-
在Liunx環境下安裝RabbitMQ, 在安裝好啟動的時候我已經將訪問外部的埠號改為15672, 所以在外部直接引用就行了
-
先從瀏覽器端做基本測試
-
開啟瀏覽器訪問RabbitMQ, 地址為Liunx系統的ip加RabbitMQ埠號15672, 看到如下介面: RabbitMQ管理頁面使用者名稱和密碼預設都使用的是guest
-
登入進去之後, 在Exchanges下建立交換機, 如圖: Name中填寫交換機的名稱, Type選擇型別, 其他預設, 直接Add即可
-
接著在Queues中新增佇列, 如圖:
-
接著在Exchanges中給自己新增的交換機新增路由鍵, 如圖: To queue屬性中填寫的是要個那個佇列繫結, Routing key中填寫的是路由鍵, 接下來就給每個交換機發送訊息, 看對應的佇列是否能收到, 自行測試
-
程式碼測試 1). 建立一個SpringBoot專案, 首先配置application.properties檔案
spring.rabbitmq.host=自己Liunx系統的ip spring.rabbitmq.username=guest spring.rabbitmq.password=guest
2). 建立一個測試實體類
public class Book { private String BookName; private String Bookauthor; public Book() { } public Book(String bookName, String bookauthor) { BookName = bookName; Bookauthor = bookauthor; } public String getBookName() { return BookName; } public void setBookName(String bookName) { BookName = bookName; } public String getBookauthor() { return Bookauthor; } public void setBookauthor(String bookauthor) { Bookauthor = bookauthor; } }
3). 建立一個自定義序列化方式的config方法
@Configuration
public class MyAMQPConfig {
/**
* 序列化時預設採用的是jdk序列化方式,我們自己要定義一個方式,不使用預設的jdk方式
* @return
*/
@Bean
public MessageConverter messageConverter(){
return new Jackson2JsonMessageConverter();
}
}
4). 建立一個監聽RabbitMQ訊息的監聽類
@Service
public class BookService {
/**
* 使用Rabbitmq監聽訊息,RabbitListener註解是監聽註解,queues是監聽那個訊息佇列
* 如果想讓該監聽機制起作用,必須在SpringBoot主方法上添加註解EnableRabbit
* @param book
*/
@RabbitListener(queues = 這塊填寫的是對應的訊息佇列名稱)
public void receive(Book book){
System.out.println("收到訊息:"+book);
}
/**
* 使用監聽機制,如果引數使用Message就可以分別獲取訊息頭和訊息體
* @param message
*/
@RabbitListener(queues = 這塊填寫的是對應的訊息佇列名稱)
public void receive02(Message message){
//獲取訊息的頭資訊
System.out.println(message.getBody());
//獲取訊息體
System.out.println(message.getMessageProperties());
}
}
5). 編寫測試類
@RunWith(SpringRunner.class)
@SpringBootTest
public class Springboot02AmqpApplicationTests {
@Autowired
RabbitTemplate rabbitTemplate;
//AmqpAdmin:RabbitMQ系統管理功能元件AmqpAdmin建立和刪除Queue,Exchange,Binding
@Autowired
AmqpAdmin amqpAdmin;
/**
* AmqpAdmin:RabbitMQ系統管理功能元件
* AmqpAdmin建立和刪除Queue,Exchange,Binding
*/
@Test
public void createExchange() {
//建立一個direct點對點式的exchange(交換器)
/*amqpAdmin.declareExchange(new DirectExchange("amqpadmin.exchange"));
System.out.println("建立一個direct點對點式的exchange成功");*/
//建立一個佇列,durable表示是否是持久化
/*amqpAdmin.declareQueue(new Queue("amqpadmin.queue",true));*/
/**
* 將交換器和訊息佇列繫結到一起,第一個destination表示的引數是要繫結的那個訊息佇列,
* 第二個引數為訊息佇列型別,第三個引數是要繫結的那個交換器,
* 第四個引數是路由鍵的名字,第五個引數是訊息物件,如果沒有可以為null
*/
amqpAdmin.declareBinding(new Binding("amqpadmin.queue", Binding.DestinationType.QUEUE, "amqpadmin.exchange", "amqp", null));
}
/**
* direct點對點,單播練習
* 序列化時預設採用的是jdk序列化方式,我們自己要定義一個方式,不使用預設的jdk方式,在MyAMQPConfig類中配置
*/
@Test
public void contextLoads() {
//Message需要自己構造一個,定義訊息體內容和訊息頭
//rabbitTemplate.send(exchage,routeKey,message);
//exchage:交換器,routeKey:路由鍵,object:要傳送的資料物件,下面這個物件就會預設被當成訊息體,而且會自動轉換
//object預設被當成訊息體,只需要傳入要傳送的物件,自動序列化傳送給rabbitmq
//rabbitTemplate.convertAndSend(exchage,routeKey,object);
Map<String, Object> map = new HashMap<>();
map.put("msg", "這是第一個訊息");
map.put("data", Arrays.asList("helloword", 123, true));
//物件被預設序列化後傳送出去
//rabbitTemplate.convertAndSend(這塊填寫的是建立的交換機的名稱,這塊填寫的是對應的訊息佇列名稱,map);
//自己定義了一個類傳送一個類看是否能夠成功
rabbitTemplate.convertAndSend(這塊填寫的是建立的交換機的名稱,這塊填寫的是對應的訊息佇列名稱, new Book("西遊記", "吳承恩"));
}
/**
* direct點對點單播,接收訊息佇列中的資料,如何將資料轉為json
*/
@Test
public void receive() {
Object o = rabbitTemplate.receiveAndConvert(這塊填寫的是對應的訊息佇列名稱);
//獲取到的資料型別
System.out.println(o.getClass());
//獲取到的資料
System.out.println(o);
}
/**
* fanout廣播方式
*/
@Test
public void sendMsg() {
rabbitTemplate.convertAndSend(這塊填寫的是建立的交換機的名稱, "", new Book("三國演義", "羅貫中"));
}
測試完畢