SpringBoot整合RabbitMQ

package com.dxy.rabbit;

import org.springframework.amqp.rabbit.annotation.EnableRabbit;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;

/**
 *
 * 自動配置原理
 *
 *  1、RabbitAutoConfiguration 自動配置類
 *  2、自動配置了ConnectionFactory(CachingConnectionFactory)
 *  3、RabbitProperties rabbit的配置類
 *  4、配置RabbitTemplate :RabbitMQ模板工具了,用於發送接收消息
 *  5、配置AmqpAdmin : RabbitMQ系統管理功能組件
 *         AmqpAdmin: 可用於創建和刪除 Exchange、Queue、Binding
 *  6、@EnableRabbit + @RabbitListener :監聽消息隊列
 */

@EnableRabbit //開啓基於註解的RabbitMQ
@SpringBootApplication
public class SpringbootRabbitmqApplication {

    public static void main(String[] args) {
        SpringApplication.run(SpringbootRabbitmqApplication.class, args);
    }

}
package com.dxy.rabbit.config;

import org.springframework.amqp.support.converter.Jackson2JsonMessageConverter;
import org.springframework.amqp.support.converter.MessageConverter;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

@Configuration
public class MyAMQPConfig {

    @Bean
    public MessageConverter messageConverter(){
        System.out.println("MyAMQPConfig");
        return new Jackson2JsonMessageConverter();
    }
}
package com.dxy.rabbit.controller;

import com.dxy.rabbit.pojo.Book;
import org.springframework.amqp.rabbit.core.RabbitTemplate;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;

import java.util.Arrays;
import java.util.HashMap;
import java.util.Map;

@RestController
public class RabbitController {

    @Autowired
    RabbitTemplate rabbitTemplate;

    @GetMapping("/send")
    public void sendMsgToQueue(){

//        Map<String,Object> message = new HashMap<String,Object>();
//        message.put("msg","first message");
//        message.put("data", Arrays.asList("Hello World",123,true));

        rabbitTemplate.convertAndSend("exchange.direct","yao",new Book("傾城之戀","張愛玲","ABCDEFG"));

    }

}
package com.dxy.rabbit.pojo;

public class Book {

    private String bookName;
    private String author;
    private String isbn;

    public Book() {
    }

    public Book(String bookName, String author, String isbn) {
        this.bookName = bookName;
        this.author = author;
        this.isbn = isbn;
    }

    public String getBookName() {
        return bookName;
    }

    public void setBookName(String bookName) {
        this.bookName = bookName;
    }

    public String getAuthor() {
        return author;
    }

    public void setAuthor(String author) {
        this.author = author;
    }

    public String getIsbn() {
        return isbn;
    }

    public void setIsbn(String isbn) {
        this.isbn = isbn;
    }
}
package com.dxy.rabbit.service;

import com.dxy.rabbit.pojo.Book;
import org.springframework.amqp.core.Message;
import org.springframework.amqp.rabbit.annotation.RabbitListener;
import org.springframework.stereotype.Service;

@Service
public class RabbitService {

    @RabbitListener(queues = "yao.news")
    public void reveive(Book book){
        System.out.println("收到消息:"+book);
    }

    @RabbitListener(queues = "yao")
    public void reveice(Message message){
        System.out.println(message.getMessageProperties());
        System.out.println(message.getBody());
    }
}
package com.dxy.springboot;

import com.dxy.rabbit.pojo.Book;
import org.junit.jupiter.api.Test;
import org.junit.runner.RunWith;
import org.springframework.amqp.core.AmqpAdmin;
import org.springframework.amqp.core.Binding;
import org.springframework.amqp.core.DirectExchange;
import org.springframework.amqp.core.Queue;
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 java.util.Arrays;
import java.util.HashMap;
import java.util.Map;

@RunWith(SpringRunner.class)
@SpringBootTest
class SpringbootRabbitmqApplicationTests {

    @Autowired
    RabbitTemplate rabbitTemplate;

    @Autowired
    AmqpAdmin amqpAdmin;

    @Test
    public void create(){
        //創建Exchange
//        amqpAdmin.declareExchange(new DirectExchange("amqpadmin.direct"));

        //創建隊列
//        amqpAdmin.declareQueue(new Queue("amqpadmin.queue"));

        //創建Exchange和Queue的綁定關係
        amqpAdmin.declareBinding(new Binding("amqpadmin.queue", Binding.DestinationType.QUEUE,"amqpadmin.direct","amqpadmin.news",null));
    }

    @Test
    void sendMsg() {
        //需要構造Message對象
//        rabbitTemplate.send(exchange,routingKey,message);


        Map<String,Object> message = new HashMap<String,Object>();
        message.put("msg","first message");
        message.put("data", Arrays.asList("Hello World",123,true));

        rabbitTemplate.convertAndSend("exchange.direct","yao.news",new Book("西遊記","吳承恩","123456"));
    }

    @Test
    void receive(){
        Object message = rabbitTemplate.receiveAndConvert("yao.news");
        System.out.println(message.getClass());
        System.out.println(message);
    }

}
spring.rabbitmq.host=xx.xx.xx.xx
spring.rabbitmq.username=guest
spring.rabbitmq.password=guest
#spring.rabbitmq.port=5672
#spring.rabbitmq.virtual-host=/
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>
    <parent>
        <groupId>com.dxy</groupId>
        <artifactId>springboot-parent</artifactId>
        <version>0.0.1-SNAPSHOT</version>
    </parent>
    <artifactId>springboot-rabbitmq</artifactId>
    <name>springboot-rabbitmq</name>
    <description>Demo project for Spring Boot</description>
    <packaging>jar</packaging>

    <dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-amqp</artifactId>
        </dependency>
    </dependencies>

    <build>
        <plugins>
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
            </plugin>
        </plugins>
    </build>

</project>

父項目pom.xml

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         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>

    <groupId>com.dxy</groupId>
    <artifactId>springboot-parent</artifactId>
    <version>0.0.1-SNAPSHOT</version>
    <!--父級項目的packaging設置爲pom-->
    <packaging>pom</packaging>

    <!--主工程包含子模塊-->
    <modules>
        <module>springboot-elasticsearch</module>
        <module>springboot-rabbitmq</module>
        <module>springboot-cache</module>
    </modules>

    <!--子模塊的Spring Boot配置-->
    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>2.2.1.RELEASE</version>
        <relativePath/> <!-- lookup parent from repository -->
    </parent>

    <!--配置參數(註釋掉的在)-->
    <properties>
        <!-- 下面的三行,其實在前面<parent>的spring-boot-starter-parent中已默認配置有 -->
        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
        <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
        <java.version>1.8</java.version>
        <maven.test.skip>true</maven.test.skip>
    </properties>

    <!--子模塊Spring Boot公共依賴-->
    <dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>
        </dependency>
    </dependencies>

</project>

RabbitMQ中包含exchange、queue、binding幾種組件

exchange:交換器,生產者將消息發送給exchange,exchange根據routingKey和exchange跟queue的綁定關係進行消息分發,

                   常用的exchange包括direct、fanout、topic三種類型

                     direct:點對點模式,routingKey跟binding完全一致才分發到相應的queue

                    fanout:訂閱模式,不看routingKey,只要是跟exchange綁定的queue都會收到消息

                    topic:教爲複雜的訂閱模式,binding關係支持#和*模糊匹配,#匹配多個單詞包括0個,*匹配一個單詞,routingKey                                 匹配成功則分發消息到queue

queue:消息隊列,保存消息的隊列,客戶端可以設置監聽器到queue上進行消息讀取消費

binding:exchange和queue之間的一種綁定規則

發佈了52 篇原創文章 · 獲贊 28 · 訪問量 15萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章