Spring Boot RabbitMQ基本使用以及Topic Exchange, Fanout Exchange – 实战篇
Github: IDEA Spring Boot RabbitMQ 消息队列
初始化项目
项目结构
测试一:RabbitMQ的简单使用
-
初始化项目后,请自行搜索 win 10 rabbitMQ 安装
-
安装完毕之后配置项目的 pom.xml, 其实就是添加以下依赖:
<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-amqp</artifactId> </dependency>
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 https://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.9.RELEASE</version> <relativePath/> <!-- lookup parent from repository --> </parent> <groupId>wen</groupId> <artifactId>rabbitmq</artifactId> <version>0.0.1-SNAPSHOT</version> <name>rabbitmq</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-web</artifactId> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-test</artifactId> <scope>test</scope> </dependency> <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>
-
接下来设置 项目目录 resources下的 application.properties 文件,配置 rabbitmq 的安装地址、端口及账户信息:
spring.rabbitmq.host=127.0.0.1 spring.rabbitmq.port=5672 spring.rabbitmq.username=guest spring.rabbitmq.password=guest
-
定义队列 config包下 RabbitConfig.java, 测试一用到的队列是
@Bean public Queue Queue() { return new Queue("hello"); }
RabbitConfig.java 完整代码:
package wen.rabbitmq.config; import org.springframework.amqp.core.Queue; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; @Configuration public class RabbitConfig { @Bean public Queue Queue() { return new Queue("hello"); } @Bean public Queue StephanieQueue() { return new Queue("Stephanie"); } @Bean public Queue objectQueue() { return new Queue("many to many"); } @Bean public Queue UserQueue() { return new Queue("user"); } }
-
定义发送者, AmqpTemplate 是 Spring Boot 提供的默认实现:
package wen.rabbitmq.oto.sender; import org.springframework.amqp.core.AmqpTemplate; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Component; import java.util.Date; @Component public class HelloSender { @Autowired private AmqpTemplate rabbitTemplate; public void send() { String context = "hello " + new Date(); System.out.println("Hello Sender: " + context); this.rabbitTemplate.convertAndSend("hello", context); } }
-
定义接收者,注意使用注解 @RabbitListener ,使用 queues 指明队列名称, @RabbitHandler 为具体接收的方法,注意,发送者和接收者的 queue name 必须一致,不然不能接收:
package wen.rabbitmq.oto.receiver; import org.springframework.amqp.rabbit.annotation.RabbitHandler; import org.springframework.amqp.rabbit.annotation.RabbitListener; import org.springframework.stereotype.Component; @Component @RabbitListener(queues = "hello") public class HelloReceiver { @RabbitHandler public void process(String hello) { System.out.println("Hello Receiver : " + hello); } }
-
测试代码:
package wen.rabbitmq; import org.junit.Test; import org.junit.runner.RunWith; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.test.context.SpringBootTest; import org.springframework.test.context.junit4.SpringRunner; import wen.rabbitmq.fanout.send.FanoutSender; import wen.rabbitmq.model.User; import wen.rabbitmq.ntn.sender.SenderOne; import wen.rabbitmq.ntn.sender.SenderTwo; import wen.rabbitmq.object.sender.ObjectSender; import wen.ra