RabbitMQ-5 Queue队列和Message详细使用

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();
    }
    
}
View Code

————————————————
版权声明:本文为CSDN博主「傲泣龙腾」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/lhmyy521125/java/article/details/87875696

posted on 2020-07-12 23:00  鑫男  阅读(1237)  评论(0编辑  收藏  举报

导航