转自:http://www.cnblogs.com/rader/archive/2012/06/28/2567779.html
如果你想创建一个只有自己可见的队列,即不允许其它用户访问,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(); } } }
相关推荐
false, // exclusive false // nowait ); ``` ### 7. 性能优化与错误处理 确保正确设置消息确认机制以避免消息丢失。在处理大量消息时,考虑使用 `queue:work --daemon` 启动工作进程以实现后台处理。另外,使用...
- **Work Queue(FIFO)**: 多个消费者,任务被分发到空闲的消费者,确保任务顺序执行。 - **发布/订阅模式**: 多个生产者,多个消费者,每个消息被所有消费者接收。 - **RPC(Remote Procedure Call)**: 通过...
result = channel.queue_declare('', exclusive=True) queue_name = result.method.queue ``` 4. **绑定Exchange和Queue**:通过Binding将Exchange和Queue关联起来,指定一个Routing Key。这样,所有带有该Routing ...
在本文中,我们将深入探讨如何使用Golang与RabbitMQ进行集成,并通过具体的实例代码来理解这一过程。RabbitMQ是一种广泛使用的开源消息代理和队列服务器,它允许应用程序之间进行异步通信。Go(也称为Golang)是...
channel.QueueDeclare(queue: "logs", durable: false, exclusive: false, autoDelete: false, arguments: null); // 消费者 var consumer = new EventingBasicConsumer(channel); consumer.Received += (model...
- 需要注意的是,如果“Reply-to Queue”为空,则“AMQP Consumer”的队列也应为空,否则无法正确接收响应数据。 **2. 参考案例** - **示例脚本**: [RPC Load Test.jmx]...
channel.QueueDeclare(queue: "logs", durable: false, exclusive: false, autoDelete: false, arguments: null); ``` **绑定队列和交换机** ```csharp var routingKey = Console.ReadLine(); channel.QueueBind...
在IT行业中,消息队列(Message Queue)作为一种重要的中间件,被广泛应用于分布式系统中,以解决异步处理、解耦合等问题。RabbitMQ作为一款成熟且广泛应用的消息队列服务,受到了广大开发者的青睐。在本文中,我们...
`amqp_queue_declare_ok_t* amqp_queue_declare(amqp_connection_state_t state, amqp_channel_t channel, amqp_bytes_t queue, amqp_boolean_t passive, amqp_boolean_t durable, amqp_boolean_t exclusive, amqp_...
exclusive=queue_config['exclusive'], auto_delete=queue_config['autoDelete']) connection = pika.BlockingConnection(pika.ConnectionParameters('localhost')) channel = connection.channel() # 假设已...
channel.QueueDeclare(queue: "my_queue", durable: true, exclusive: false, autoDelete: false, arguments: null); string message = "Hello, RabbitMQ!"; channel.BasicPublish(exchange: "my_exchange", ...
channel.QueueDeclare(queue: "test_queue", durable: false, exclusive: false, autoDelete: false, arguments: null); ``` ### 4. 发布消息 发布消息到交换机,RabbitMQ会根据已定义的路由键将消息发送到相应的...
channel.QueueDeclare(queue: "test_queue", durable: false, exclusive: false, autoDelete: false, arguments: null); // 发送消息 var message = Encoding.UTF8.GetBytes("Hello, RabbitMQ!"); channel....
如果RabbitMQ支持quorum queue,还是建议换成quorum queue。 配置示例 以下是一个使用RabbitMQ的配置示例: ```yaml spring: rabbitmq: addresses: 192.168.137.104:5672,192.168.137.105:5672,192.168.137.106:...
channel.QueueDeclare(queue: "my_queue", durable: false, exclusive: false, autoDelete: false, arguments: null); ``` 然后,将交换机和队列绑定,指定路由键。这决定了生产者发送带有特定路由键的消息将被路由...
queue队列中可以指定一些属性,例如auto-declare、durable和exclusive。 Exchange是RabbitMQ中的一种路由机制,用于将消息路由到不同的队列中。我们可以定义多种类型的Exchange,例如fanout、direct和topic类型的...
channel.QueueDeclare(queue: "myQueue", durable: false, exclusive: false, autoDelete: true, arguments: null); ``` 四、发布消息 发布消息到指定的队列中,通常使用`BasicPublish`方法: ```csharp var ...
RabbitMQ是一种消息队列(Message Queue)的实现方式,它为了解决应用程序间的数据传递和数据流转问题。消息队列是一个消息服务或消息中间件,允许多个不同的系统或系统中不同的模块通过排队和异步消息传递进行交互...
channel.QueueDeclare(queue: "hello", durable: false, exclusive: false, autoDelete: false, arguments: null); var message = Encoding.UTF8.GetBytes("Hello World!"); channel.BasicPublish(exchange: "", ...
channel.QueueDeclare(queue: "my_queue", durable: true, exclusive: false, autoDelete: false, arguments: null); ``` 3. **发送消息**:通过`channel.BasicPublish()`方法将消息发送到交换机,交换机会根据绑定...