关键的RabbitMQ方法参数

6 java messaging amqp publish-subscribe rabbitmq

我正在尝试阅读并理解RabbitMQ Java客户端中的3个基本方法:

这些方法有几个含糊不清且神秘的论据,尽管Javadocs确实对它们的含义做了一些解释,但是并没有真正明确/明确这些论点的作用:

  • Channel#basicConsume
    • consumerTag - 客户端生成的消费者标记,用于建立上下文
    • noLocal - 如果服务器不应传递给此通道连接上发布的此消费者消息,则为 true
    • exclusive - 如果这是一个独家消费者,则为true
    • arguments - 消费者的一组参数
  • Channel#basicPublish
    • exchangeName - 要将消息发布到的交换
    • routingKey - 路由密钥
  • DefaultConsumer#handleDelivery
    • 信封 - 包装消息的数据

这些方法并正确使用它们对于以最简单的形式使用RabbitMQ(基本发布和消息来往于队列的消息)至关重要.直到我理解这些论点是什么 - 以及它们在服务器端暗示/做了什么 - 我被困住并且不确定如何继续使用库.

一些厌倦战斗的RabbitMQ老手可以帮助像我这样的新手了解这7个方法论点,以及它们用于什么?Javadoc的解释还不够清楚.例如:"参数 - 消费者的一组参数".什么?!?!或者:"独家 - 如果这是一个独家消费者,那就是真的"......那么什么是独家消费者?!?!等等,提前谢谢!

Yog*_*wal 6

请按照以下两个链接: -

https://www.rabbitmq.com/ttl.html

http://www.rabbitmq.com/amqp-0-9-1-quickref.html

Java创建一个队列,其中消息最多可驻留60秒:

Map<String, Object> args = new HashMap<String, Object>();
args.put("x-message-ttl", 60000);
channel.queueDeclare("myqueue", false, false, false, args);
Run Code Online (Sandbox Code Playgroud)


小智 5

要彻底了解RabbitMQ的实现,您可能需要阅读AMQP协议规范和参考资料。通常,无论使用何种语言,规范都应解释所有参数

下面的链接解释了消费者标签

独家的:

独占队列只能由当前连接访问,并在该连接关闭时被删除。不允许其他连接被动声明独占队列。服务器必须同时支持独占(私有)和非独占(共享)队列。客户端可能不会尝试使用被另一个仍然打开的连接声明为独占的队列。错误代码:资源锁定

客户标签:

指定使用者的标识符。消费者标签是通道的本地标签,因此两个客户端可以使用相同的消费者标签。如果此字段为空,服务器将生成一个唯一标签。客户端不得指定引用现有消费者的标签。错误代码:not-allowed 消费者标签仅在创建消费者的通道内有效。即客户端不得在一个频道中创建消费者,然后在另一个频道中使用它。错误代码:不允许

AMQP 扩展以了解其他 Args(地图)

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);
Run Code Online (Sandbox Code Playgroud)

如果消息重新排队(例如,由于使用具有重新排队参数的 AMQP 方法,或由于通道关闭),则会保留消息的原始到期时间。

将 x-message-ttl 设置为 0 会导致消息在到达队列时过期,除非它们可以立即传递给消费者。因此,这提供了 RabbitMQ 服务器不支持的 basic.publish 立即标志的替代方案。与该标志不同,没有发出 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);
Run Code Online (Sandbox Code Playgroud)