1、导读
本章节主要介绍Queue队列和消息Message的详细介绍。包含构建过程中各参数的详细解释,话不多说我们开始吧
2、Queue队列
在第一章 初识RabbitMQ 中我们简单介绍了Queue,Queue的主要是作用于存储消息;在之前的样例中大家应该能看到如何构建一个Queue,即queueDeclare方法
queueDeclare
queueDeclare 有两个重载方法
Queue.DeclareOk queueDec1are() throws IOException;
第一种不带任何参数的queueDeclare 方法默认创建一个由RabbitMQ 命名的(类似这种amq.gen-LhQzlgv3GhDOv8PIDabOXA 名称,这种队列也称之为匿名队列〉、排他的、自动删除的、非持久化的队列。
Queue.DeclareOk queueDeclare (String queue , boolean durable , boolean exclusive,
boolean autoDelete, Map<String,Object> arguments) throws IOException;
第二种方法参数详解:
queue :队列的名称
durable :设置是否持久化。为true 则设置队列为持久化。持久化的队列会存盘,在服务器重启的时候可以保证不丢失相关信息
exclusive :设置是否排他(独占队列)。为true 则设置队列为排他的。如果一个队列被声明为排他队列,该队列仅对首次声明它的连接可见,并在连接断开时自动删除。这里需要注意三点:排他队列是基于连接( Connection) 可见的,同一个连接的不同信道(Channel)是可以同时访问同一连接创建的排他队列; "首次"是指如果一个连接己经声明了一个排他队列,其他连接是不允许建立同名的排他队列的,这个与普通队列不同:即使该队列是持久化的,一旦连接关闭或者客户端退出,该排他队列都会被自动删除,这种队列适用于一个客户端同时发送和读取消息的应用场景
autoDelete :设置是否自动删除,当最后一个监听被移除后,自动删除队列;也就是说至少有一个消费者连接到这个队列,之后所有与这个队列连接的消费者都断开时,才会自动删除
arguments :设置队列的一些其他参数;
queueBind
在之前的代码样例种我们能看到queueBind这个方法,它的主要作用是将交换机和队列进行绑定;我们主要讲解其两个构造方法的参数详解
Queue.BindOk queueBind(String queue , String exchange , String routingKey)
Queue.BindOk queueBind(String queue , String exchange , String routingKey , Map<String, Object> arguments)
方法中涉及的参数详解:
- queue :声明的队列名称
- exchange : 声明的交换器名称
- routingKey :用来绑定队列和交换器的路由键
- argument :定义绑定的一些参数
queueUnbind
同理既有绑定操作也必然有解绑操作,方法如下,参数和绑定都是一样的裂解,不再码字了~
Queue.BindOk queueUnBind(String queue , String exchange , String routingKey)
Queue.BindOk queueUnBind(String queue , String exchange , String routingKey , Map<String, Object> arguments)
3、Massage 消息
它是服务器和应用程序间传输的数据,我们在前面的样例代码种可以看到发送消息的样例;Channel.basicPublish 方法,它有几个重载方法
(1) void basicPublish (String exchange , String routingKey, BasicProperties props ,byte[) body) throws IOException ; (2) void basicPublish (String exchange , String routingKey, boolean mandatory, BasicProperties props ,byte[) body) throws IOException ; (3) void basicPublish (String exchange , String routingKey, boolean mandatory, boolean immediate, BasicProperties props ,byte[) body) throws IOException ;
具体参数详细介绍如下:
exchange :交换器的名称,指明消息需要发送到哪个交换器中,如果设置为空,则默认发送到RabbitMQ 默认的交换器中
routingKey : 路由键
mandatory :当mandatory 参数设为true 时,交换器无法根据自身的类型和路由键找到一个符合条件的队列,那么RabbitMQ 会调用Basic.Return 命令将消息返回给生产者。当mandatory参数设置为false 时,出现上述情形,则消息直接被丢弃(再往后的教程中再详细讲解)
immediate :当imrnediate参数设为true时,如果交换器在将消息路由到队列时发现队列上并不存在任何消费者,那么这条消息将不会存入队列中。当与路由键匹配的所有队列都没有消费者时,该消息会通过Basic.Return返回至生产者
props :消息的基本属性集,分别有
1、contentType (消息类型)
2、contentEncoding (消息编码)
3、headers( Map<String ,Object>) (自定义的一些消息数据)
4、deliveryMode (消息是否持久化 = 2)
5、priority (消息优先级)
6、correlationld (可以理解为消息的唯一ID)
7、replyTo (消息重回队列)
8、expiration (过期时间)
9、messageld
10、timestamp
11、type
12、userld
13、appld
14、clusterld
body :消息体( payload ) 需要发送的消息
接下来我们还是用一段代码来加深理解
public class MessageProducer { public static void main(String[] args) throws Exception { //1 创建ConnectionFactory ConnectionFactory connectionFactory = new ConnectionFactory(); connectionFactory.setHost("192.168.1.28"); connectionFactory.setPort(5672); connectionFactory.setVirtualHost("/"); connectionFactory.setUsername("toher"); connectionFactory.setPassword("toher888"); //2 创建Connection Connection connection = connectionFactory.newConnection(); //3 创建Channel Channel channel = connection.createChannel(); //4 声明 String routingKey = "test.direct"; //5 发送 Map<String, Object> headers = new HashMap<>(); headers.put("param1", "111"); headers.put("param1", "222"); AMQP.BasicProperties properties = new AMQP.BasicProperties.Builder() .deliveryMode(2) //设置持久化 .contentEncoding("UTF-8") .expiration("10000") //设置10秒过期 .headers(headers) //传递自定义headers .build(); String msg = "Test Message"; //exchangeName 为空 默认走RabbitMQ默认交换机 channel.basicPublish("", routingKey , properties , msg.getBytes()); channel.close(); connection.close(); } }
————————————————
版权声明:本文为CSDN博主「傲泣龙腾」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/lhmyy521125/java/article/details/87875696