一、下载并配置RabbitMQ https://www.cnblogs.com/vipstone/p/9275256.html
二、使用
1、在POM中添加依赖
<!-- https://mvnrepository.com/artifact/com.rabbitmq/amqp-client -->
<dependency>
<groupId>com.rabbitmq</groupId>
<artifactId>amqp-client</artifactId>
<version>5.6.0</version>
</dependency>
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-simple</artifactId>
<version>1.7.25</version>
<scope>compile</scope>
</dependency>
2、RabbitUtil
package RabbitMQ实现.RabbitUtil;
import java.io.IOException;
import java.util.concurrent.TimeoutException;
import com.rabbitmq.client.*;
/*
* author: hubz
* datetime: 2020/2/2 14:31
*/
// https://segmentfault.com/a/1190000012439688
// https://www.cnblogs.com/vipstone/p/9275256.html
public class RabbitMQUtil {
private static final String HOST = "127.0.0.1";
private static final int PORT = 5672;
private static final String USERNAME = "guest";
private static final String PASSWORD = "guest";
private static ConnectionFactory factory;
static{
// 1、创建连接管理器
factory = new ConnectionFactory();
// 设置RabbitMQ相关信息
factory.setHost(HOST);
//设置RabbitMQ协议端口
factory.setPort(PORT);
//设置RabbitMQ用户名
factory.setUsername(USERNAME);
//设置RabbitMQ密码
factory.setPassword(PASSWORD);
//设置RabbitMQ数据库
factory.setVirtualHost("/");//VirtualHost默认为/
}
public static Connection getConnection() throws IOException, TimeoutException {
// 2、创建一个新的连接
return factory.newConnection();
}
public static void main(String[] args) throws IOException, TimeoutException {
/*
* ConnectionFactory(连接管理器):应用程序与Rabbit之间建立连接的管理器,程序代码中使用;
*
* Channel(信道):消息推送使用的通道;
*
* RoutingKey(路由键/关键字):用于把生成者的数据分配到交换器上;
*
* Exchange(交换器):用于接受、分配消息;
* 可以没有交换器,一个信道对应 一个/多个 消息队列
* 发送消息时指定路由关键字
*
* BindingKey(绑定键):用于把交换器的队列绑定到队列上;
*
* Queue(队列):用于存储生产者的消息;
*
*/
Connection connection = getConnection();
// 3、创建一个信道
Channel channel = connection.createChannel();
String EXCHANGE_NAME = "TestExchange";
// 4、创建一个交换器
/*
* 声明一个交换机
* exchangeDeclare(String exchange, String type, boolean durable, boolean autoDelete, Map<String, Object> arguments)
*
* exchange:交换机的名字
* type:交换机类型
*
* durable:参考queueDeclare中的同名参数
* autoDelete:参考queueDeclare中的同名参数
* arguments:参考queueDeclare中的同名参数
*/
channel.exchangeDeclare(EXCHANGE_NAME, "direct", true, false, null);
// 5、声明一个队列
/*
* 作用:声明队列--->在没有队列时创建队列,有则复用,如果没有队列,有消息,消息则无处可存
* channel.queueDeclare(String queue,
* boolean durable,
* boolean exclusive,
* boolean autoDelete,
* Map<String, Object> arguments)
*
*
* name:队列名字
* durable:是否持久化。默认保存到内存中,RabbitMQ重启会丢失,如果想重启后还存在,就需要使队列持久化
* 持久化后,保存到Erlang自带的Mnesia数据库中,当RabbitMQ重启之后会读取该数据库
*
* exclusive:是否是排它的;作用:当连接关闭时connection.close(),该队列是否会自动删除(是否为当前连接的专用队列)
* 如果一个队列声明为排它队列,该队列公对首次声明它的连接可见,并在连接断开时自动删除;
*
* 排它:是基于连接的Connection可见的,同一个连接的不同信道是可以同时访问同一个连接创建的排他队列;
*
* 首次:是指如果一个连接已经声明了一个排他队列,其它连接是不允许建立同名的排他队列,这个与普通队列不同,即使该队
* 列是持久化的,一旦连接关闭或者客户端退出,该排他队列都会被自动删除;
*
* 这个队列适用于一个客户端同是发送和读取消息的应用场景
*
* autoDelete:是否自动删除队列。当最后一个消费者断开连接之后队列是否自动删除,可以通过控制台来查看队列的
* 消费者数量,当cunsumers=0时队列就会自动删除
*
* 至少有一个消息者连接到这个队列,之后所有与这个队列连接的消息都断开时,才会自动删除;
*
* 生产者客户端创建这个队列,或者没有消息者客户端连接这个队列时,不会自动删除这个队列;
*
* noWait:是否等待服务器返回
* args:相关参数,目前一般为null
*/
// channel.queueDeclare("queueName", true, false, false, null);
channel.queueDeclare("queue",true,false,false,null);
System.out.println("Producer Send begin");
// 6、绑定
/*
* 将交换器与队列通过路由键绑定
* queueBind(String queue, String exchange, String routingKey)
*
* queue:队列名称
* exchange:交换器名称
* routingKey:路由key或者绑定key
*
* https://blog.csdn.net/CleverCode/article/details/80684550
*/
//使用参考:https://blog.csdn.net/Hubz131/article/details/104156079
//channel.queueBind("","","");
/*
* 设置消息持久化:
* 设置消息持久化必须先设置队列持久化,要不然队列不持久化,消息持久化,队列都不存在了,消息存在还有什么意义。
* 消息持久化需要将交换机持久化、队列持久化、消息持久化,才能最终达到持久化的目的
*/
//消息持久化方式一
// AMQP.BasicProperties.Builder properties = new AMQP.BasicProperties().builder();
// properties.deliveryMode(2); // 设置消息是否持久化,1: 非持久化 2:持久化
// channel.basicPublish("", "queueName", properties.build(), "hello World1".getBytes("UTF-8"));
//消息持久化方式二
// channel.basicPublish("", "queueName", null, "hello World1".getBytes("UTF-8"));
//消息持久化方式三
// channel.basicPublish("", "queueName", MessageProperties.PERSISTENT_TEXT_PLAIN, "hello World1".getBytes("UTF-8"));
/*
* 作用:消息生产者发送消息给消息队列
* basicPublish(String exchange,
* String routingKey,
* boolean mandatory,
* boolean immediate,
* BasicProperties props,
* byte[] body)
*
* exchange:交换机名称
*
* routingKey:路由关键字
*
* mandatory:
* true:交换器无法根据自动的类型和路由键找到一个符合条件的队列,那么RabbitMq会调用Basic.Ruturn命令将消息返回给生产者;
* false:出现上述情况消息被直接丢弃;
*
* immediate:消息是否立即发送出去
* 为true时:
* 如果交换器在消息路由到队列时发现没有任何消费者,那么这个消息将不会存入队列,
* 当与路由匹配的所有队列都没有消费者时,会Basic.Return返回给生产者;
*
* props:消息的基本属性,例如路由头等
* body:消息内容
*/
channel.basicPublish("TestExchange","",null,"HaHa".getBytes("UTF-8"));
System.out.println("Producer Send end");
channel.close();
connection.close();
}
}
/*
* 虚拟主机
* 每个Rabbit都能创建很多vhost,我们称之为虚拟主机,每个虚拟主机其实都是mini版的RabbitMQ,拥有自己的队列,交换器和绑定,拥有自己的权限机制。
*
* vhost特性:
* 1) RabbitMQ默认的vhost是“/”开箱即用;
* 2) 多个vhost是隔离的,多个vhost无法通讯,并且不用担心命名冲突(队列和交换器和绑定),实现了多层分离;
* 3) 创建用户的时候必须指定vhost;
*
* vhost操作:
* 创建vhost: rabbitmqctl add_vhost [vhost_name]
* 删除vhost: rabbitmqctl delete_vhost [vhost_name]
* 查看所有的vhost: rabbitmqctl list_vhosts
*
*
*/
/*
*交换机类型:
* Direct:https://blog.csdn.net/CleverCode/article/details/80684550
* fanout:https://blog.csdn.net/CleverCode/article/details/80714298
* Topic:https://blog.csdn.net/CleverCode/article/details/80719014
*/
来源:CSDN
作者:Hubz131
链接:https://blog.csdn.net/Hubz131/article/details/104146410