要彻底了解 RabbitMQ 的实现,您可能必须阅读 AMQP 协议规范和参考。一般而言,无论使用何种语言,规范都应解释所有参数
下面的链接解释了消费者标签
独家的:
独占队列只能由当前连接访问,并在该连接关闭时被删除。不允许其他连接被动声明排他队列。服务器必须同时支持独占(私有)和非独占(共享)队列。客户端不能尝试使用被另一个仍然打开的连接声明为独占的队列。错误代码:资源锁定
客户标签:
指定使用者的标识符。消费者标签是频道的本地标签,因此两个客户端可以使用相同的消费者标签。如果此字段为空,服务器将生成一个唯一标记。客户端不得指定引用现有消费者的标签。错误代码:不允许 消费者标签仅在创建消费者的通道内有效。即客户端不得在一个通道中创建消费者,然后在另一个通道中使用它。错误代码:不允许
AMQP 扩展以了解其他 Args (Map)
http://www.rabbitmq.com/extensions.html
示例 - TTL:
每队列消息 TTL
queue.declare 的 x-message-ttl 参数控制发布到队列的消息在被丢弃之前可以存活多长时间。如果消息在队列中的停留时间超过配置的 TTL,则称该消息已死。请注意,路由到多个队列的消息可能会在不同的时间消失,或者根本不会在它所在的每个队列中消失。一个队列中消息的死亡不会影响其他队列中同一消息的生命周期。
服务器保证死消息不会包含在任何 basic.get-ok 或 basic.deliver 方法中。此外,服务器将尝试在基于 TTL 的到期时或之后不久获取消息。
x-message-ttl 参数的值必须是一个非负的 32 位整数 (0 <= n <= 2^32-1),以毫秒为单位描述 TTL 周期。因此,值 1000 意味着添加到队列的消息将在队列中存在 1 秒或直到它被传递给消费者。参数可以是 AMQP 类型的 short-short-int、short-int、long-int 或 long-long-int。
这个 Java 示例创建了一个队列,其中消息最多可驻留 60 秒:
Map<String, Object> args = new HashMap<String, Object>();
args.put("x-message-ttl", 60000);
channel.queueDeclare("myqueue", false, false, false, args);
如果消息被重新排队(例如由于使用具有重新排队参数的 AMQP 方法,或由于通道关闭),则会保留消息的原始到期时间。
将 x-message-ttl 设置为 0 会导致消息在到达队列时过期,除非它们可以立即传递给消费者。因此,这提供了一个替代 basic.publish 的即时标志的替代方案,RabbitMQ 服务器不支持该标志。与该标志不同,没有发出 basic.returns,如果设置了死信交换,则消息将是死信的。
每消息 TTL
通过在发送 basic.publish 时在基本 AMQP 类中设置过期字段,可以在每个消息的基础上指定 TTL。
expire 字段的值以毫秒为单位描述 TTL 周期。适用与 x-message-ttl 相同的约束。由于过期字段必须是字符串,因此代理将(仅)接受数字的字符串表示形式。
当同时指定每个队列和每个消息的 TTL 时,将选择两者之间的较低值。
这个 Java 示例发布一条消息,该消息最多可在队列中停留 60 秒:
byte[] messageBodyBytes = "Hello, world!".getBytes();
AMQP.BasicProperties properties = new AMQP.BasicProperties();
properties.setExpiration("60000");
channel.basicPublish("my-exchange", "routing-key", properties, messageBodyBytes);