1、父pom.xml
<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.java.ashare</groupId>
<artifactId>JavaAction</artifactId>
<version>0.0.1-SNAPSHOT</version>
<packaging>pom</packaging>
<name>JavaAction</name>
<description>JavaAction</description>
<modules>
<!-- spring boot rabbitmq集成 -->
<module>SpringBootRabbitMQ</module>
</modules>
<properties>
<java.version>1.8</java.version>
</properties>
<!-- spring boot启动父依赖 -->
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.1.0.RELEASE</version>
<relativePath/>
</parent>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<configuration>
<source>${java.version}</source>
<target>${java.version}</target>
</configuration>
</plugin>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
</plugins>
</build>
</project>
2、子pom.xml
<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>com.java.ashare</groupId>
<artifactId>JavaAction</artifactId>
<version>0.0.1-SNAPSHOT</version>
</parent>
<artifactId>SpringBootRabbitMQ</artifactId>
<name>SpringBootRabbitMQ</name>
<description>SpringBootRabbitMQ</description>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-amqp</artifactId>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-jar-plugin</artifactId>
<version>2.6</version>
<configuration>
<archive>
<manifest>
<addClasspath>true</addClasspath>
<classpathPrefix>lib/</classpathPrefix>
<mainClass>com.java.ashare.config.client.ConfigClientApplication</mainClass>
</manifest>
</archive>
</configuration>
</plugin>
</plugins>
</build>
</project>
3、生产者
package com.java.ashare.rabbitmq.client;
import com.rabbitmq.client.Channel;
import com.rabbitmq.client.Connection;
import com.rabbitmq.client.ConnectionFactory;
import com.rabbitmq.client.ShutdownListener;
import com.rabbitmq.client.ShutdownSignalException;
public class Producer {
public void send() throws Exception {
ConnectionFactory connectionFactory = new ConnectionFactory();
connectionFactory.setHost("192.168.78.169");
connectionFactory.setPort(5672);
connectionFactory.setUsername("guest");
connectionFactory.setPassword("guest");
connectionFactory.setVirtualHost("/");
// 创建连接,如果遇到一个channel流量很大时会拖累其他同一个Connection创建的channel,此时可以考虑连接池
Connection conn = connectionFactory.newConnection();
// connection、channel关闭监听器,回调
conn.addShutdownListener(new ShutdownListener() {
@Override
public void shutdownCompleted(ShutdownSignalException cause) {
if(cause.isHardError()) {
Connection conn = (Connection) cause.getReference();
} else {
Channel channel = (Channel) cause.getReference();
}
}
});
// 创建信道channel
// Connection可以创建多个channel实例,但一个channel实例不能在线程间共享,线程不安全
// 一般情况下:一个线程对应一个channel
Channel channel = conn.createChannel();
// 声明交换器
// exchange: 交换器名称
// type: 交换器类型,direct、topic、fanout、headers
// durable: 持久化,默认为false,true表示存盘重启不会丢失(持久化交换器元数据,不是消息)
// autoDelete: 自动删除,默认为false,true表示自动删除,前提是至少有一个队列或交换器与这个交换器绑定,之后所有队列或交换器都与此解绑
// internal: 是否内置,默认为false,true表示内置交换器,客户端无法直接发送消息到此交换器,只能通过交换器路由到交换器这种方式
// arguments: 其他一些结构化参数,如alternate-exchange
channel.exchangeDeclare("EXCHANGE_1", "direct");
//channel.exchangeDeclare(exchange, type, durable);
//channel.exchangeDeclare(exchange, type, durable, autoDelete, arguments);
//channel.exchangeDeclare(exchange, type, durable, autoDelete, internal, arguments);
// 客户端无需等待服务器返回Declare-OK,返回值void,如果声明完之后,紧接着使用这个交换器,会发生异常,不建议使用
//channel.exchangeDeclareNoWait(exchange, type, durable, autoDelete, internal, arguments);
// 检测交换器是否存在,如果存在正常返回,如果不存在则抛出异常,同时channel会关闭
//channel.exchangeDeclarePassive(name);
// 删除交换器
// exchange: 交换器名称
// ifUnused: 设置是否在交换器没有被使用的情况下删除,true表示此交换器没有被使用才会删除,false表示无论如何都会被删除
//channel.exchangeDelete(exchange);
//channel.exchangeDelete(exchange, ifUnused);
//channel.exchangeDeleteNoWait(exchange, ifUnused);
// 声明队列
// queue:队列名称
// durable: 持久化,默认为false,true表示存盘重启不会丢失(持久化队列元数据,不是消息)
// exclusive:是否排他,为 true 则设置队列为排他的。如果一个队列被声明为排他队列,该队列仅对首次声明它的连接可见,并在连接断开时自动删除。
// 这里需要注意三点:排他队列是基于连接( Connection) 可见的,同 个连接的不同信道 (Channel)
// 是可以同时访问同一连接创建的排他队列; "首次"是指如果 个连接己经声明了
// 排他队列,其他连接是不允许建立同名的排他队列的,这个与普通队列不同:即使该队
// 列是持久化的,一旦连接关闭或者客户端退出,该排他队列都会被自动删除,这种队列
// 适用于一个客户端同时发送和读取消息的应用场景。
// autoDelete: 是否自动删除,true表示自动删除,前提是至少有一个消费者连接到这个队列,然后所有消费者都断开与这个队列的连接,才会自动删除
// arguments: 设置其他一些参数,如x-message-ttl, x-expires, x-max-length, x-dead-letter-exchange, x-dead-letter-routing-key等等
channel.queueDeclare("QUEUE_1", false, false, false, null);
//channel.queueDeclare(); // 默认创建一个由rabbitmq命名的队列,匿名队列,排他的、自动删除的、非持久化
//channel.queueDeclare(queue, durable, exclusive, autoDelete, arguments);
// 返回void,无需等待服务器的任何返回
//channel.queueDeclareNoWait(queue, durable, exclusive, autoDelete, arguments);
// 检测队列是否存在,如果存在则正常返回,如果不存在则抛出异常
//channel.queueDeclarePassive(queu