6

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

这些方法有几个神秘而神秘的参数,尽管 Javadocs 确实提供了一些关于它们是什么的解释,但并没有真正清楚/清楚地说明这些参数的作用:

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

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

一些厌战的 RabbitMQ 老手能否帮助像我这样的新手理解这 7 个方法参数,以及它们的用途?Javadoc 的解释还不够清楚。例如:“参数 - 消费者的一组参数”。什么?!?!或者:“独家 - 如果这是独家消费者,则为真”......那么什么是独家消费者?!?!等提前谢谢!

4

2 回答 2

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);
于 2013-09-09T14:04:45.203 回答
5

要彻底了解 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);
于 2013-09-02T16:23:26.230 回答