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之間的一種綁定規則