RabbitMQ:排他性队列(Exclusive Queue)
2012-06-28 16:17
27 查看
如果你想创建一个只有自己可见的队列,即不允许其它用户访问,RabbitMQ允许你将一个Queue声明成为排他性的(Exclusive Queue)。
该队列的特点是:
只对首次声明它的连接(Connection)可见
会在其连接断开的时候自动删除。
对于第一点,首先是强调首次声明,因为另外一个连接无法声明一个同样的排他性队列;其次是只区别连接(Connection)而不是通道(Channel),从同一个连接创建的不同的通道可以同时访问某一个排他性的队列。这里说的连接是指一个AMQPConnection,以RabbitMQ的Java客户端为例:
如果试图在一个不同的连接中重新声明或访问(如publish,consume)该排他性队列,会得到资源被锁定的错误:
ESOURCE_LOCKED - cannot obtain exclusive access to locked queue 'UserLogin2'
对于第二点,RabbitMQ会自动删除这个队列,而不管这个队列是否被声明成持久性的(Durable =true)。 也就是说即使客户端程序将一个排他性的队列声明成了Durable的,只要调用了连接的Close方法或者客户端程序退出了,RabbitMQ都会删除这个队列。注意这里是连接断开的时候,而不是通道断开。这个其实前一点保持一致,只区别连接而非通道。
下面是一段示例代码,演示了如何在同一连接的不同通道中访问排他性队列:
该队列的特点是:
只对首次声明它的连接(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多设备消息队列-Python开发
- 最快队列ActiveMQ, RabbitMQ, HornetQ, QPID
- 用php操作消息隊列,RabbitMQ消息队列在PHP下的应用大全
- 基于PHP使用rabbitmq实现消息队列
- RabbitMQ消息队列的小伙伴: ProtoBuf(Google Protocol Buffer)
- 短时间内向rabbitmq的某条队列发送大量消息时,可能会丢包
- python RabbitMQ消息队列
- RabbitMQ消息队列(四):分发到多Consumer(Publish/Subscribe)
- RabbitMQ-使用Java操作简单队列 simple queues
- rabbitmq-任务轮询队列
- 系统拆分解耦利器之消息队列---RabbitMQ-RPC远程调用
- rabbitmq结合spring实现消息队列优先级的方法
- RabbitMQ如何在命令行下清除消息队列中的所有数据
- (八)RabbitMQ消息队列-通过Topic主题模式分发消息
- RabbitMQ (二)工作队列
- RabbitMQ消息队列(三):任务分发机制[转]
- 柯南君:看大数据时代下的IT架构(7)消息队列之RabbitMQ--案例(routing 起航)
- RabbitMQ消息队列(一): 简单队列
- 记录两个用pika和kombu实现的rabbitmq队列操作
- php rabbitmq延迟队列示例