[英]Is RabbitMQ's AMQP.BasicProperties.Builder thread-safe?
[英]RabbitMQ AMQP.BasicProperties.Builder values
在 RabbitMQ/AMQP Java 客户端中,您可以创建一个AMQP.BasicProperties.Builder
,并使用它来build()
AMQP.BasicProperties
一个实例。 这个构建的属性实例可以用于各种重要的事情。 这个构建器类有很多“构建器”风格的方法可用:
BasicProperties.Builder propsBuilder = new BasicProperties.Builder();
propsBuilder
.appId(???)
.clusterId(???)
.contentEncoding(???)
.contentType(???)
.correlationId(???)
.deliveryMode(2)
.expiration(???)
.headers(???)
.messageId(???)
.priority(???)
.replyTo(???)
.timestamp(???)
.type(???)
.userId(???);
我正在寻找这些构建器方法有助于“构建”哪些字段,最重要的是,每个字段存在哪些有效值。 例如,什么是clusterId
,它的有效值是什么? 什么是type
,它的有效值是什么? 等等。
我整个上午都在搜索:
在所有这些文档中,我找不到明确的定义(除了对priority
、 contentEncoding
和deliveryMode
是什么的一些模糊解释)以及它们的有效值是什么。 有人知道吗? 更重要的是,有人知道这些甚至记录在哪里吗? 提前致谢!
通常我使用非常简单的方法来记住一些东西。 我将在下面提供所有详细信息,但这里是 BasicProperties 字段和值的简单图片。 我还尝试正确突出显示队列/服务器和应用程序上下文。
如果你想让我稍微增强它 - 只需留下一个小评论。 我真正想要的是提供一些视觉键并简化理解。
请注意 Clust ID 已被弃用,因此我将其排除在外。
顺便说一句,我终于设法查看了最新的服务器代码( rabbitmq-server-3.1.5 ),rabbit_stomp_test_util.erl 中有一个示例:
content_type = <<"text/plain">>,
content_encoding = <<"UTF-8">>,
delivery_mode = 2,
priority = 1,
correlation_id = <<"123">>,
reply_to = <<"something">>,
expiration = <<"my-expiration">>,
message_id = <<"M123">>,
timestamp = 123456,
type = <<"freshly-squeezed">>,
user_id = <<"joe">>,
app_id = <<"joe's app">>,
headers = [{<<"str">>, longstr, <<"foo">>},
{<<"int">>, longstr, <<"123">>}]
很高兴知道有人想知道所有细节。 因为最好尽可能使用众所周知的消息属性,而不是在消息正文中放置信息。 顺便说一句,基本的消息属性远非清晰和有用。 我会说最好使用自定义的。
很好的例子(来源)
更新 - 到期字段
重要说明:到期属于队列上下文。 因此消息可能会被服务器丢弃。
README 说明如下:
expiration
是一个shortstr; 由于 RabbitMQ 将期望这是一个编码字符串,我们将ttl
转换为其整数值的字符串表示。
资料来源:
在撰写本文时:
在这个答案中:
contentType
和contentEncoding
文本描述——这是安全的,因为这些是 AMQP 1.0 中具有良好描述的标准字段。以下文字是我从这些来源中转述的,以使其更加简洁或清晰。
正如您在上面看到的,这些属性中的绝大多数没有枚举/约束/推荐值,因为它们“仅供应用程序使用”并且不被 RabbitMQ 使用。 所以你的工作很轻松。 您可以自由地写入/读取对您的应用程序有用的值 - 只要它们匹配数据类型并编译 :)。 ContentType
和contentEncoding
根据标准 HTTP 使用。 DeliveryMode
和priority
是受限制的数字。
注意: AMQP.BasicProperties 有用但简单的常量在MessageProperties类中可用。
干杯:)
更新发布:
非常感谢 Renat(见评论),查看了 rabbit_amqqueue_process.erl 中的 erlang 服务器代码和RabbitMQ TTL Extensions to AMQP 中的文档。 可以指定消息过期时间(time-to-live)
每个队列通过:
Map<String, Object> args = new HashMap<String, Object>(); args.put("x-message-ttl", 60000); channel.queueDeclare("myqueue", false, false, false, args);
或每条消息通过:
byte[] messageBodyBytes = "Hello, world!".getBytes(); AMQP.BasicProperties properties = new AMQP.BasicProperties(); properties.setExpiration("60000"); channel.basicPublish("my-exchange", "routing-key", properties, messageBodyBytes);
这里,ttl/expiration 以毫秒为单位,所以在每种情况下都是 60 秒。 更新了上述过期定义以反映这一点。
AMQP
规范定义了一个通用的、可扩展的属性模型。
AMQP 属性在概念上与 HTTP 标头有些相似,因为它们表示有关消息的元数据。 就像在 HTTP 中一样,它们与消息有效负载分开构建。 但它们基本上是一个键/值映射。
一些像 RabbitMQ 这样的代理会解释某些消息属性,比如expiration
以添加额外的特定于供应商的值(在这种情况下,强制执行 TTL )。
但最终,AMQP 属性只是一大堆键/值对,它们与每条消息一起安全发送,如果您选择这样做的话。 您的 AMQP 经纪人的文档将告诉您他们特别解释哪些以及如何发送您自己的。
话虽如此,如果您首先问这个问题,那么您可能根本不需要担心它们。 您将能够成功发送消息,而无需担心设置任何消息属性。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.