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(???);
_
これらのbuilerメソッドが「ビルドアップ」に役立つフィールド、および最も重要なことには、各フィールドに存在する有効な値を探しています。たとえば、clusterId
とは何ですか?また、その有効な値は何ですか? type
とは何ですか、またその有効な値は何ですか?等。
私は午前中ずっと精練をしてきました:
これらのすべてのドキュメントでは、これらの各フィールドとその有効な値の明確な定義(いくつかのvaguepriority
、contentEncoding
およびdeliveryMode
の説明以外)を見つけることができません。誰か知っていますか?さらに重要なことは、これらがどこで文書化されているかを誰もが知っていますか?前もって感謝します!
通常、私は非常に単純なアプローチを使用して何かを暗記します。以下にすべての詳細を示しますが、BasicPropertiesフィールドと値の簡単な図を次に示します。また、キュー/サーバーおよびアプリケーションコンテキストを適切に強調表示しようとしました。
あなたが私にそれを少し強化したいなら-ちょっとしたコメントを落としてください。私が本当に欲しいのは、視覚的なキーを提供し、理解を簡単にすることです。
高レベルの説明( source 1 、 source 2 ):
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">>}]
誰かがすべての詳細を知りたいと思うのは良いことです。可能であれば、メッセージ本文に情報を配置するのではなく、既知のメッセージ属性を使用する方がはるかに優れているためです。ところで、基本的なメッセージプロパティは、明確で有用なものとはほど遠いです。カスタムを使用する方が良いと思います。
良い例(- source )
更新-有効期限フィールド
重要な注意:expirationはキューコンテキストに属します。そのため、サーバーによってメッセージがドロップされる場合があります。
READMEは次のように述べています。
expiration
はshortstrです。 RabbitMQはこれがエンコードされた文字列であると想定するため、ttl
をその整数値の文字列表現に変換します。
ソース:
執筆時点:
この答えでは:
contentType
およびcontentEncoding
のテキストによる説明でした。これらはAMQP 1.0で適切に説明された標準フィールドであるため、安全です。次のテキストは、これらのソースから、もう少し簡潔または明確にするために言い換えられています。
上記からわかるように、これらのプロパティの大部分は「アプリケーション使用のみ」であり、RabbitMQによって使用されないため、列挙値/制約値/推奨値がありません。あなたは簡単な仕事をしています。アプリケーションに役立つ値を自由に書き込んだり読み込んだりできます-データ型が一致し、コンパイルされている限りです:)。 ContentType
およびcontentEncoding
は、標準のHTTP使用によるものです。 DeliveryMode
とpriority
は制約付きの数値です。
注:AMQP.BasicPropertiesの便利ですが単純な定数は、クラス MessageProperties で使用できます。
乾杯:)
UPDATE TO POST:
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秒です。これを反映するために、expirationの定義を更新しました。
AMQP
仕様は、プロパティの一般的な拡張可能なモデルを定義します。
AMQPプロパティは、問題のメッセージに関するメタデータを表すという点で、概念的にはHTTPヘッダーに多少似ています。 HTTPの場合と同じように、メッセージペイロードに対して 個別にフレーム化 です。しかし、それらは基本的にキー/値マップです。
RabbitMQなどの一部のブローカーは、expiration
などの特定のメッセージプロパティを解釈して、ベンダー固有の値を追加します(その場合、 TTLを強制 )。
しかし、最終的に、AMQPプロパティは、各メッセージと一緒に安全に送信されるキー/値のペアの大きな束にすぎません。 AMQPブローカーのドキュメントは、彼らが特別に解釈するものと、あなた自身のものを送る方法を教えてくれます。
そうは言っても、そもそもこの質問をしているのであれば、おそらくそれらについて心配する必要はないでしょう。メッセージプロパティを設定することをまったく心配せずに、メッセージを正常に送信できます。