1. 程式人生 > >SpringBoot與訊息中介軟體(RabbitMQ)的基本使用

SpringBoot與訊息中介軟體(RabbitMQ)的基本使用

最近新的專案分配給我的任務需要用到RabbitMQ做訊息中介軟體, RabbitMQ已經忘了好多, 今天就來回顧一下RabbitMQ的基本使用(注: 不瞭解RabbitMQ的請參考: https://blog.csdn.net/w1316022737/article/details/83820050)

  1. 在Liunx環境下安裝RabbitMQ, 在安裝好啟動的時候我已經將訪問外部的埠號改為15672, 所以在外部直接引用就行了

  2. 先從瀏覽器端做基本測試

  3. 開啟瀏覽器訪問RabbitMQ, 地址為Liunx系統的ip加RabbitMQ埠號15672, 看到如下介面: 在這裡插入圖片描述 RabbitMQ管理頁面使用者名稱和密碼預設都使用的是guest

  4. 登入進去之後, 在Exchanges下建立交換機, 如圖: 在這裡插入圖片描述 Name中填寫交換機的名稱, Type選擇型別, 其他預設, 直接Add即可

  5. 接著在Queues中新增佇列, 如圖: 在這裡插入圖片描述

  6. 接著在Exchanges中給自己新增的交換機新增路由鍵, 如圖: 在這裡插入圖片描述 To queue屬性中填寫的是要個那個佇列繫結, Routing key中填寫的是路由鍵, 接下來就給每個交換機發送訊息, 看對應的佇列是否能收到, 自行測試

  7. 程式碼測試 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("三國演義", "羅貫中"));
    }

測試完畢