RabbitMQ排他性队列Exclusive Queue详解

 更新时间:2023年08月29日 11:10:24   作者:排骨虾  
这篇文章主要介绍了RabbitMQ排他性队列Exclusive Queue详解,如果你想创建一个只有自己可见的队列,即不允许其它用户访问,RabbitMQ允许你将一个Queue声明成为排他性的Exclusive Queue,需要的朋友可以参考下

RabbitMQ排他性队列Exclusive Queue

如果你想创建一个只有自己可见的队列,即不允许其它用户访问,RabbitMQ允许你将一个Queue声明成为排他性的(Exclusive Queue)。

 

该队列的特点是:

  • 只对首次声明它的连接(Connection)可见
  • 会在其连接断开的时候自动删除。

对于第一点,首先是强调首次声明,因为另外一个连接无法声明一个同样的排他性队列;其次是只区别连接(Connection)而不是通道(Channel),从同一个连接创建的不同的通道可以同时访问某一个排他性的队列。

这里说的连接是指一个AMQPConnection,以RabbitMQ的Java客户端为例:

Connection conn = factory.newConnection();    

如果试图在一个不同的连接中重新声明或访问(如publish,consume)该排他性队列,会得到资源被锁定的错误:

ESOURCE_LOCKED - cannot obtain exclusive access to locked queue 'UserLogin2'

 对于第二点,RabbitMQ会自动删除这个队列,而不管这个队列是否被声明成持久性的(Durable =true)。

也就是说即使客户端程序将一个排他性的队列声明成了Durable的,只要调用了连接的Close方法或者客户端程序退出了,RabbitMQ都会删除这个队列。

注意这里是连接断开的时候,而不是通道断开

这个其实前一点保持一致,只区别连接而非通道。

下面是一段示例代码,演示了如何在同一连接的不同通道中访问排他性队列:

package rabbitmq.java.sample.exclusivequeue;
import java.io.IOException;
import com.rabbitmq.client.*;
import com.rabbitmq.client.AMQP.Queue.DeclareOk;
public class Producer {
    private final static String QUEUE_NAME = "UserLogin2";
    private final static String EXCHANGE_NAME = "user.login";
    /**
     * @param args
     */
    public static void main(String[] args) {
        ConnectionFactory factory=new ConnectionFactory();
        factory.setHost("CNCDS108");
        try {
            Connection conn = factory.newConnection();            
            Channel channel =conn.createChannel();
            DeclareOk declareOk = channel.queueDeclare(QUEUE_NAME, true, true, false, null);
            channel.basicPublish("", QUEUE_NAME, null, "Hello".getBytes());
            //close the channel, check if the queue is deleted
            System.out.println("Try to close channel");
            channel.close();
            System.out.println("Channel closed");
            System.out.println("Create a new channel");
            Channel channel2 =conn.createChannel();
            DeclareOk declareOk2 = channel2.queueDeclarePassive(QUEUE_NAME);
            //we can access the exclusive queue from another channel
            System.out.println(declareOk2.getQueue()); //will output "UserLogin2"
            channel2.basicPublish("", QUEUE_NAME, null, "Hello2".getBytes());
            System.out.println("Message published through the new channel");
//            System.out.println("Try to close Connection");
//            conn.close();
//            System.out.println("Connection closed");
        } catch (IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
    }
}

到此这篇关于RabbitMQ排他性队列Exclusive Queue详解的文章就介绍到这了,更多相关RabbitMQ排他性队列内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • Java将RTF转换为PDF格式的实现

    Java将RTF转换为PDF格式的实现

    本文主要介绍了Java将RTF转换为PDF格式的实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2022-07-07
  • Mybatis-Plus自动填充更新操作相关字段的实现

    Mybatis-Plus自动填充更新操作相关字段的实现

    数据库表中应该都要有create_time、update_time字段;那么在开发中,对于这些共有字段的处理应该要进行统一,这样就可以简化我们的开发过程。那么本文就对Mybatis-Plus中的字段自动填充进行记录
    2021-11-11
  • java后端返回数据给前端时去除值为空或NULL的属性、忽略某些属性代码示例

    java后端返回数据给前端时去除值为空或NULL的属性、忽略某些属性代码示例

    在Java开发中我们处理JSON数据时经常会遇到空值(null)的情况,这篇文章主要给大家介绍了关于java后端返回数据给前端时去除值为空或NULL的属性、忽略某些属性的相关资料,文中通过代码介绍的非常详细,需要的朋友可以参考下
    2024-07-07
  • 如何在Java中获取当前年份(实例代码)

    如何在Java中获取当前年份(实例代码)

    在Java语言中获取当前年份有几种方法:使用java.util包下的Calendar类,使用java.time包下的LocalDate类或者使用java.text包下的SimpleDateFormat类,本文通过实例代码给大家介绍的非常详细,需要的朋友参考下吧
    2023-11-11
  • springboot接口加签验签常见的几大问题及解决过程

    springboot接口加签验签常见的几大问题及解决过程

    在SpringBoot框架中通过自定义注解实现加签验签功能是一个非常实用的技术,本文主要介绍了使用SpringBoot进行加签验签时可能遇到的几个问题,包括请求流重复读取问题、控制器中文件参数读取为空问题、FormData表单提交MD5加密值不一致问题
    2024-11-11
  • java编程简单获取图片像素的方法

    java编程简单获取图片像素的方法

    这篇文章主要介绍了java编程简单获取图片像素的方法,涉及Java针对图片的读取与属性获取技巧,具有一定参考借鉴价值,需要的朋友可以参考下
    2015-11-11
  • java中表示一个文件的File类型详解

    java中表示一个文件的File类型详解

    Java提供File类,让我们对文件进行操作,下面这篇文章主要给大家介绍了关于java中表示一个文件的File类型的相关资料,文中通过示例代码介绍的非常详细,需要的朋友可以参考借鉴,下面随着小编来一起学习学习吧
    2018-07-07
  • 这么优雅的Java ORM没见过吧!

    这么优雅的Java ORM没见过吧!

    这篇文章主要介绍了Java ORM的相关资料,帮助大家更好的理解和使用Java,感兴趣的朋友可以了解下
    2021-01-01
  • Java实现读取文件夹下(包括子目录)所有文件的文件名

    Java实现读取文件夹下(包括子目录)所有文件的文件名

    这篇文章主要介绍了Java实现读取文件夹下(包括子目录)所有文件的文件名,本文把代码组织成了一个模块,可以很方便的使用,需要的朋友可以参考下
    2015-06-06
  • 解决出现 java.lang.ExceptionInInitializerError错误问题

    解决出现 java.lang.ExceptionInInitializerError错误问题

    这篇文章主要介绍了解决出现 java.lang.ExceptionInInitializerError错误问题的相关资料,需要的朋友可以参考下
    2017-01-01

最新评论