RabbitMQ AMQP.BasicProperties.Builder值

43 java messaging amqp rabbitmq

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

我正在寻找这些builer方法帮助"建立"的字段,最重要的是,每个字段存在哪些有效值.例如,什么是a clusterId,它的有效值是什么?什么是type有效值?等等.

我整个上午都在淘洗:

在所有这些文档,我无法找到明确的定义(除了一些含糊的解释是什么priority,contentEncoding以及deliveryMode是)什么的每个领域都,以及他们的有效值.有人知道吗?更重要的是,有人知道这些甚至记录在哪里吗?提前致谢!

Ren*_*nov 79

通常我会用非常简单的方法记忆一些东西.我将在下面提供所有细节,但这里是BasicProperties字段和值的简单图片.我还试图正确突出显示队列/服务器和应用程序上下文.

在此输入图像描述

如果你想让我加强一点 - 只需删掉一个小评论.我真正想要的是提供一些视觉键并简化理解.

高级描述(源1,源2):

请注意Clust ID已被弃用,因此我将其排除.

  • 应用程序ID - 生成消息的应用程序的标识符.
    • 上下文:应用程序使用
    • 值:可以是任何字符串.
  • 内容编码 - 消息内容编码
    • 上下文:应用程序使用
    • 值:MIME内容编码(例如gzip)
  • 内容类型 - 消息内容类型
    • 上下文:应用程序使用
    • 值:MIME内容类型(例如application/json)
  • 相关ID - 与此相关的消息,例如,此消息是回复的请求.鼓励应用程序使用此属性,而不是将此信息放入消息有效内容中.
    • 上下文:应用程序使用
    • 价值:任何价值
  • 传递模式 - 邮件是否应保留在磁盘上?
    • 上下文:队列实现使用
    • 值:非持久性(1)或持久性(2)
  • 到期 - 将删除邮件的到期时间.到期字段的值描述了TTL周期(以毫秒为单位).请看下面的详细信息.
    • 上下文:队列实现使用
  • 标头 - 任意特定于应用程序的消息标头.
    • 上下文:应用程序使用
  • 消息ID - 消息标识符作为字符串.如果应用程序需要识别消息,建议他们使用此属性而不是将其放入消息有效负载中.
    • 上下文:应用程序使用
    • 价值:任何价值
  • 优先级 - 消息优先级.
    • 上下文:队列实现使用
    • 值:0到9
  • ReplyTo - 其他应用程序应将响应发送到的队列名称.通常用于命名回复队列(或帮助消费者应用程序指示其响应的任何其他标识符).鼓励应用程序使用此属性,而不是将此信息放入消息有效内容中.
    • 上下文:应用程序使用
    • 价值:任何价值
  • 时间戳 - 发送消息的时刻的时间戳.
    • 上下文:应用程序使用
    • 价值:自大纪元以来的秒数.
  • 类型 - 消息类型,例如此消息表示的事件或命令的类型.建议应用程序使用,而不是将此信息包含在消息有效内容中.
    • 上下文:应用程序使用
    • 值:可以是任何字符串.
  • 用户ID - 可选用户ID.RabbitMQ根据实际连接用户名验证.
    • 上下文:队列实现使用
    • 值:应该是经过身份验证的用户.

顺便说一句,我终于设法审查了最新的服务器代码(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">>}]
Run Code Online (Sandbox Code Playgroud)

很高兴知道有人想知道所有的细节.因为在可能的情况下使用众所周知的消息属性要好得多,而不是在消息体中放置信息.顺便说一下,基本的消息属性远非清晰有用.我会说最好使用自定义的.

在此输入图像描述

很好的例子(来源)

在此输入图像描述

更新 - 到期字段

重要说明:到期属于队列上下文.因此服务器可能会丢弃该消息.

在此输入图像描述

自述文件说明如下:

expiration是一个短暂的; 因为RabbitMQ会期望这是一个编码字符串,我们将a转换ttl为其整数值的字符串表示.

资料来源:


Gle*_*est 10

在撰写本文时:

  1. 最新的AMQP标准是AMQP 1.0 OASIS标准.
  2. 最新版本的RabbitMQ是3.1.5(服务器和客户端),声称支持AMQP 0.9.1(压缩pdf和XML模式).
  3. RabbitMQ将自己的协议描述作为XML模式提供,包括扩展(即非标准),加上没有扩展的XML模式(与通过(2)链接的模式相同)和pdf doc.

在这个答案中:

  • (3)中的链接是细节的主要来源
  • (2)如果(3)不充分,则使用pdf doc作为次要细节
  • 如果(2)不合适,则源代码(java客户端,erlang服务器)用作第三细节.
  • (1)通常不使用 - 协议和模式已经(通过OASIS)(相当)显着进化,并且应该适用于RabbitMQ的未来版本,但现在不适用.使用(1)的两个例外是文本描述contentTypecontentEncoding- 这是安全的,因为这些是AMQP 1.0中具有良好描述的标准字段.

我从这些来源中解释了以下文字,使其更加简洁或清晰.

  • content-type(AMQP XML type ="shortstr"; java type ="String"):可选.消息的应用程序数据部分(正文)的RFC-2046 MIME类型.可以包含定义所使用的字符编码的charset参数:例如,'text/plain; 字符集="UTF-8"".如果内容类型未知,则不应设置内容类型,允许收件人确定实际类型.如果已知该部分是真正不透明的二进制数据,则内容类型应该设置为application/octet-stream.
  • content-encoding(AMQP XML type ="shortstr"; java type ="String"):可选.当存在时,描述应用于应用程序数据的附加内容编码,并且因此需要应用什么解码机制以便获得由内容类型头部字段引用的媒体类型.主要用于允许压缩文档而不会丢失其基础内容类型的标识.内容类型的修饰符,根据RFC 2616的第3.5节进行解释.有效的内容编码在IANA注册.实现不应使用压缩编码,除非与最初使用其他协议(例如HTTP或SMTP)发送的消息保持兼容.实现不应指定多个内容编码值,除非与最初使用其他协议(例如HTTP或SMTP)发送的消息兼容.
  • headers(AMQP XML type ="table"; java type ="Map"):可选.应用程序指定的标头参数列表及其值.这些可以设置为仅供应用程序使用.此外,可以使用"标头交换类型"创建队列 - 创建队列时,会为其提供一系列要匹配的标头属性名称,每个标头都具有要匹配的可选值,以便通过标头路由到此队列-匹配.
  • deliveryMode(RabbitMQ XML type ="octet"; java type ="Integer"):1(非持久性)或2(持久性).仅适用于实现持久性的队列.持久性消息安全地保存在磁盘上,即使出现严重的网络故障,服务器崩溃,溢出等问题,也能保证交付.
  • priority(AMQP XML type ="octet"; java type ="Integer"):相对消息优先级(0到9).一个高优先级的消息是[可能是?? - GB]在等待在同一消息队列中的较低优先级消息之前发送.当必须丢弃消息以维持特定的服务质量级别时,服务器将首先丢弃低优先级消息.仅适用于实现优先级的队列.
  • correlation-id(AMQP XML type ="octet"; java type ="String"):可选.对于应用程序使用,没有正式(RabbitMQ)行为.客户端特定的ID,可用于标记或标识客户端之间的消息.
  • replyTo(AMQP XML type ="shortstr"; java type ="String"):可选.对于应用程序使用,没有正式(RabbitMQ)行为,但在请求消息中使用时可能包含私有响应队列的名称.要发送回复的节点的地址.
  • 到期(AMQP XML type ="shortstr"; java type ="String"):可选.来自(3)的RabbitMQ AMQP 0.9.1模式声明"对于实现使用,没有正式行为".来自(2)的AMQP 0.9.1模式pdf表示该消息被认为过期的绝对时间.但是,必须忽略两个描述,因为此TTL链接和客户端/服务器代码指示以下内容为真.从客户端,只能通过BasicProperties的自定义应用程序初始化来填充到期.在服务器上,这用于在排队之前从服务器接收消息的点确定TTL.服务器选择TTL作为(1)消息TTL的最小值(客户端BasicProperties到期相对时间,以毫秒为单位)和(2)队列TTL(以毫秒为单位配置x-message-ttl).格式:字符串引用的整数,表示毫秒数; 从服务器接收消息到期的时间.
  • message-id(AMQP XML type ="shortstr"; java type ="String"):可选.对于应用程序使用,没有正式(RabbitMQ)行为.如果设置,则消息生产者应将其设置为全局唯一值.在将来(AMQP 1.0)中,如果message-id的值与发送到同一节点的先前接收的消息的值匹配,则代理可以将消息作为副本丢弃.
  • timestamp(AMQP XML type ="timestamp"; java type ="java.util.Date"):可选.对于应用程序使用,没有正式(RabbitMQ)行为.创建此消息的绝对时间.
  • type(AMQP XML type ="shortstr"; java type ="String"):可选.对于应用程序使用,没有正式(RabbitMQ)行为.[将消息描述为属于/属于特定于应用程序的"类型"或"表单"或"业务事务" - GB]
  • userId(AMQP XML type ="shortstr"; java type ="String"):可选.XML Schema声明"对于应用程序使用,没有正式(RabbitMQ)行为" - 但我相信这在最新版本中有所改变(继续阅读).如果设置,则客户端将此值设置为负责生成消息的用户的标识.来自RabbitMQ:如果此属性由发布者设置,则其值必须等于用于打开连接的用户的名称(即进行验证以确保它是已连接/已验证的用户).如果未设置user-id属性,则发布者的身份将保持私有.
  • appId(RabbitMQ XML type ="shortstr"; java type ="String"):可选.对于应用程序使用,没有正式(RabbitMQ)行为.创建应用程序ID.可由生产者填充并由消费者阅读.(查看R-MQ服务器代码,服务器根本不使用它,尽管"webmachine-wrapper"插件提供了一个脚本和匹配模板来创建一个webmachine - 管理员可以在其中为脚本提供appId.)
  • cluster Id(RabbitMQ XML type ="N/A"; java type ="String"):在AMQP 0.9.1中不推荐使用 - 即未使用.在以前的版本中,是集群应用程序使用的集群内路由标识符,客户端应用程序不应使用该标识符(即未填充).但是,这已被弃用并从当前架构中删除,并且不被R-MQ服务器代码使用.

如您所见,绝大多数这些属性没有枚举/约束/推荐值,因为它们只是"仅应用程序",并且不被RabbitMQ使用.所以你有一份轻松的工作.您可以自由地编写/读取对您的应用程序有用的值 - 只要它们匹配数据类型并编译:). ContentTypecontentEncoding按照标准HTTP使用. DeliveryMode并且priority是受约束的数字.

注意:在MessageProperties类中可以使用AMQP.BasicProperties的有用但简单的常量.

干杯:)

更新到POST:

非常感谢Renat(参见评论),看了一下rabbit_amqqueue_process.erl中的erlang服务器代码和RabbitQQ TTL Extensions到AMQP的文档.可以指定消息到期(生存时间)

  • 每个队列通过:

    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)
  • 或通过以下消息:

    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)

这里,ttl/expiration以毫秒为单位,每种情况下为60秒.已更新上述过期定义以反映此情况.