RabbitMQ整合Spring AMQP實戰涉及到如下幾個部分
- 集成RabbitAdmin
- SpringAMQP 聲明
- rabbitTemplate
- SimpleMessageListenerContainer
- MessageListenAdapter
- MessageConverter
(通過spring集成RabbitMQ)
搭建基本的項目運行框架
1.項目pom文件
<?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>
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.1.4.RELEASE</version>
<relativePath/> <!-- lookup parent from repository -->
</parent>
<groupId>com.star</groupId>
<artifactId>rabbitmq</artifactId>
<version>0.0.1-SNAPSHOT</version>
<packaging>jar</packaging>
<name>rabbitmq</name>
<description>rabbitmq整合spring AMQP</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>com.rabbitmq</groupId>
<artifactId>amqp-client</artifactId>
<version>5.4.3</version>
</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>
2.創建配置類
package com.star.rabbitmq.config;
/**
* @Author likai
* @Description rabbitmq配置
* @Date 2020/3/10 21:08
**/
public class Config {
/**
* rabbitmq ip
* */
public static String HOST = "127.0.0.1";
/**
* rabbitmq 端口
* */
public static int PORT = 5672;
/**
* rabbitmq 賬號
* */
public static String USERNAME = "root";
/**
* rabbitmq 密碼
* */
public static String USERPASS = "123456";
}
3.創建RabbitMQConfig配置類做基本配置
RabbitAdmin類可以很好的操作RabbitMQ,在Spring中直接進行注入即可
注意:autoStartup必須要設置未true,否則Spring容器不會加載RabbitAdmin類。
RabbitAdmin 底層實現就是從Spring容器中獲取Exchange、Bindind、RoutingKey以及Queue的@Bean聲明。然後使用RabbitTemplate的execute方法執行對應的聲明、修改、刪除等一些列RabbitMQ基礎功能操作。例如:添加一個交換機、刪除一個綁定、清空一個隊列裏的消息等等。
配置文件代碼:
package com.star.rabbitmq.config;
import org.springframework.amqp.rabbit.connection.CachingConnectionFactory;
import org.springframework.amqp.rabbit.connection.ConnectionFactory;
import org.springframework.amqp.rabbit.core.RabbitAdmin;
import org.springframework.context.annotation.Bean;
/**
* @Author likai
* @Description
* @Date 2020/3/10 21:19
**/
@Configuration
public class RabbitMQConfig {
/**
* @Description: 創建rabbitmq連接工廠
* @param
* @return ConnectionFactory
* @throws
* @author kaili
* @date 2020/3/10 21:21
*/
@Bean
public ConnectionFactory connectionFactory(){
CachingConnectionFactory connectionFactory = new CachingConnectionFactory();
connectionFactory.setHost(Config.HOST);
connectionFactory.setPort(Config.PORT);
connectionFactory.setUsername(Config.USERNAME);
connectionFactory.setPassword(Config.USERPASS);
return connectionFactory;
}
@Bean
public RabbitAdmin rabbitAdmin(ConnectionFactory connectionFactory){
RabbitAdmin rabbitAdmin = new RabbitAdmin(connectionFactory);
rabbitAdmin.setAutoStartup(true);
return rabbitAdmin;
}
}
4.測試RabbitAdmin
通過以上的步驟基本上已經完成了spring集成RabbitAdmin,現在通過代碼來測試是否夠集成成功。在測試類中測試RabbitAdmin是否可用
4.1 測試創建交換機
package com.star.rabbitmq;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.amqp.core.DirectExchange;
import org.springframework.amqp.core.FanoutExchange;
import org.springframework.amqp.core.Queue;
import org.springframework.amqp.core.TopicExchange;
import org.springframework.amqp.rabbit.core.RabbitAdmin;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.test.context.junit4.SpringRunner;
@RunWith(SpringRunner.class)
@SpringBootTest
public class RabbitmqSpringApplicationTests {
@Autowired
private RabbitAdmin rabbitAdmin;
/**
* @Description: 測試RabbitAdmin
* @author kaili
* @date 2020/3/10 21:32
*/
@Test
public void testRabbitAdmin(){
//測試1 創建Exchange
rabbitAdmin.declareExchange(new DirectExchange("test.direct",false,false));
rabbitAdmin.declareExchange(new TopicExchange("test.topic",false,false));
rabbitAdmin.declareExchange(new FanoutExchange("test.fanout",false,false));
}
}
啓動測試代碼,觀察管控頁面是否有對應交換機創建成功
測試窗口代碼運行正常,觀察管控頁面
創建了三種類型的交換機,非持久類型
4.2測試創建隊列
在testRabbitAdmin接口添加如下的測試代碼
//測試2 創建隊列
String queueDirect = "test.direct.queue";
String queueTopic = "test.topic.queue";
String queueFanout = "test.fanout.queue";
rabbitAdmin.declareQueue(new Queue(queueDirect,false));
rabbitAdmin.declareQueue(new Queue(queueTopic,false));
rabbitAdmin.declareQueue(new Queue(queueFanout,false));
啓動testRabbitAdmin接口,觀察管控臺頁面
觀察交換機頁面,由於之前的測試已經創建過哪三個交換機接口重複執行創建代碼也不會創建新的交換機。
4.3 交換機和隊列綁定
//3.測試綁定
rabbitAdmin.declareBinding(new Binding(queueDirect,
Binding.DestinationType.QUEUE,
"test.direct",
"direct",
new HashMap<>()));
rabbitAdmin.declareBinding(
BindingBuilder.bind(new Queue(queueTopic,false))
.to(new TopicExchange("test.topic",false,false))
.with("user.#")
);
rabbitAdmin.declareBinding(
BindingBuilder.bind(new Queue(queueTopic,false))
.to(new FanoutExchange("test.fanout",false,false))
);
啓動代碼觀察三個交換機的綁定關係
test.direct
test.fanout
test.topic
在test.direct、test.topic、test.fanout交換機中發送消息,觀察消息是否發送到對應的隊列中
到對應的隊列中觀察消息是否存在
查看消息類容
與在交換機中發送的消息一致
4.4 清除隊列中的消息
//清空隊列數據
rabbitAdmin.purgeQueue(queueDirect,false);