• 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

  • 相关阅读:
    20181205关于android动态权限管理的总结与思考。
    pixel2坑
    Picasso遇到的坑
    集成主流框架搭建项目
    outdoor-youwin
    利用scatter()绘制颜色映射的二次方曲线
    一个有意义的Day类
    [Hadoop] Yarn & k8s
    hadoop 操作
    yarn 图形化监控
  • 原文地址:https://www.cnblogs.com/hup666/p/13290540.html
Copyright © 2020-2023  润新知