メッセージングプログラミングリファレンス
Red Hat Enterprise Messaging でプログラミングガイド
概要
第1章 はじめに リンクのコピーリンクがクリップボードにコピーされました!
1.1. Red Hat Enterprise MRG Messaging リンクのコピーリンクがクリップボードにコピーされました!
1.2. Apache Qpid リンクのコピーリンクがクリップボードにコピーされました!
1.3. AMQP - Advanced Message Queuing Protocol リンクのコピーリンクがクリップボードにコピーされました!
1.4. AMQP 0-10 と AMQP 1.0 の相違点 リンクのコピーリンクがクリップボードにコピーされました!
Broker Architecture
ブローカー管理
symmetry
1.5. MRG-M 3 での AMQP 1.0 サポート リンクのコピーリンクがクリップボードにコピーされました!
1.5.1. C++ qpid::messaging API のサポート リンクのコピーリンクがクリップボードにコピーされました!
qpid::messaging API で書かれた C++ および C# のアプリケーションが AMQP 1.0 について、特定のブローカーにその使用を結び付けないように、AMQP 1.0 と通信できます。
1.5.2. 応答先および一時的なキュー リンクのコピーリンクがクリップボードにコピーされました!
#' 文字で始まるノード名を、UUID を挿入して変換します。これは、名前がクライアントによって選択される 0-10 で適切に機能し、一意でなければなりません。名前のこの変換は、1 つのアドレス文字列からアドレスを作成する際に行われます(構成される部分ではなく)。その後、変更後の名前にアクセスできます Address::getName()。
Sender、およびの両方に追加 getAddress() されてい Receiverます。
reply-to 行いますが、1.0 に切り替えるアプリケーションでは、送信したリクエストメッセージで適切なアドレスを設定して正しいアドレスを取得してください。(この新しいアプローチは 0-10 と 1.0 の両方で機能します)。
1.5.3. 接続、セッション、およびリンク リンクのコピーリンクがクリップボードにコピーされました!
protocol' 接続プロパティーからランタイム時に選択されます。認識できる値は 'amqp1.0' およびamqp0-10' です。AMQP 0-10 は依然としてデフォルトであり、1.0 のサポートは必要なモジュール(Apache Proton ライブラリー)がロードされている場合にのみ利用できます。
sasl_mechanisms connection オプションを設定でき NONEます。
1.5.4. addresses リンクのコピーリンクがクリップボードにコピーされました!
*#')が含まれる場合 legacy-amqp-topic-binding、これは a として送信されなければ送信され legacy-amqp-direct-bindingます。
#' で始まる場合、動的フラグは対応するソースまたはターゲットに設定され、ノードのプロパティーに基づいて設定 dynamic-node-properties されます。動的フラグを設定すると、アドレスは指定しないでください。
1.5.5. オンデマンド作成レガシーアプリケーションの回避策 リンクのコピーリンクがクリップボードにコピーされました!
#' を使用するか、または create ポリシーを介して作成される場合 - ノードのプロパティーがソースまたはターゲット dynamic-node-properties に送信されます。これらは、ノード内のネストされたマップで指定できます。また、ノードマップのすべての durable および type プロパティーが送信されます。また、ノードの 0-10 スタイルからの翻訳も x-declare あります。ノードに指定されたすべてのフィールドは、プロパティーに記載されているように含まれます。
1.5.6. リンクスコープの x-declare および x-subscribe リンクのコピーリンクがクリップボードにコピーされました!
x-declare および x-subscribe はサポートされていません。
1.5.7. ノードおよびリンクスコープの x-bindings リンクのコピーリンクがクリップボードにコピーされました!
x-bindings プロパティーは、ノードまたはリンクの AMQP 1.0 ではサポートされません。
1.5.8. ポリシーの削除 リンクのコピーリンクがクリップボードにコピーされました!
1.5.9. ノードのライフタイムポリシー リンクのコピーリンクがクリップボードにコピーされました!
amqp:delete-on-close:list、リンク確立に対応するように作成されたノードの以下のポリシーを定義します amqp:delete-on-no-links:list amqp:delete-on-no-messages:list amqp:delete-on-no-links-or-messages:list。
delete-on-close、、、delete-if-empty またはのショートカット名を提供 delete-if-unusedします delete-if-unused-and-empty。
"my-queue;{create:always, node: {properties: {lifetime-policy: delete-if-empty}}}"
1.5.10. メッセージのタイムスタンプ リンクのコピーリンクがクリップボードにコピーされました!
1.5.11. AMQP メッセージプロパティーおよびヘッダーへのアクセス リンクのコピーリンクがクリップボードにコピーされました!
properties セクションの message-id correlation-id user-id subject、、、、reply-to および content-type フィールドはすべて、Message インスタンス上の同じ名前のアクセプターで設定または取得できます。これは、header セクションの durable、priority および ttl フィールドでも同様です。
header セクション内に delivery-count フィールドがあります。このフィールドには直接アクセプターがありません。ただし、値が 1 を超える場合、Message::getRedelivered() メソッドは true を返します。 の値で呼び出さ Message::setRedelivered() れた場合 true、配信数は 1 に設定され、それ以外の場合は 0 に設定されます。
application-properties セクションは、Message クラスの properties マップから利用できます。properties マップは、メッセージを送信するときに application-properties セクションを設定するために使用されます。
Message クラスに直接アクセプターを持たない AMQP 1.0 メッセージ形式で定義された他のフィールドがあります。
x-amqp-<field-name>。使用中 x-amqp-delivery-count のキーは、x-amqp-first-acquirer および header セクション、および x-amqp-to x-amqp-absolute-expiry-time x-amqp-creation-time x-amqp-group-id、x-amqp-qroup-sequence および properties セクション x-amqp-reply-to-group-id のキーです。
x-amqp-delivery-annotations て利用でき x-amqp-message-annotations ます。
1.5.12. qpidd の AMQP サポート リンクのコピーリンクがクリップボードにコピーされました!
qpidd、amqp モジュールを読み込む必要があります。これにより、ブローカーは 0-10 1 と共に 1.0 プロトコルヘッダーを認識できます。
1.5.13. SASL(Simple Authentication and Security Layer)のサポート リンクのコピーリンクがクリップボードにコピーされました!
1.5.14. キューと交換 リンクのコピーリンクがクリップボードにコピーされました!
# qpid-config list incoming
# qpid-config list outgoing
dynamic-node-properties いると、は作成されたノードの特性を判断するために使用されます。プロパティーは QMF create メソッドのプロパティーと同じです。0-10 で定義されたオプション durable auto-delete alternate-exchange、exchange-type およびなどの qpidd 固有のオプションです qpid.max-count。
supported-dist-modes プロパティーは、キューまたは交換が必要かどうかを判断します( create メソッドは 'type' プロパティーを使用します)。をmove指定すると、キューが作成されます。'copy' が指定されている場合、交換が作成されます。このプロパティーが設定されていない場合、キューが想定されます。
1.5.15. フィルター リンクのコピーリンクがクリップボードにコピーされました!
legacy-amqp-direct-bindinglegacy-amqp-topic-bindinglegacy-amqp-headers-bindingselector-filterxquery-filter
filter プロパティーの link プロパティーで指定できます。この filter プロパティーの値はマップの一覧である必要があります。各マップは、名前、記述子(数値またはシンボリックとして指定できます)のキーと値のペアでフィルターを指定し、値を指定する必要があります。例:
my-xml-exchange; {link:{filter:{value:"declare variable $colour external; colour='red'",name:x,descriptor:"apache.org:xquery-filter:string"}}}
| direct | トピック | ジャンクアウト | headers | xml | Queue | |
|---|---|---|---|---|---|---|
legacy-amqp-direct-binding
|
◯
|
◯
|
いいえ
|
いいえ
|
◯
|
◯
|
legacy-amqp-topic-binding
|
いいえ
|
◯
|
いいえ
|
いいえ
|
いいえ
|
◯
|
legacy-amqp-headers-binding
|
いいえ
|
いいえ
|
いいえ
|
◯
|
いいえ
|
いいえ
|
xquery-filter
|
いいえ
|
いいえ
|
いいえ
|
いいえ
|
◯
|
いいえ
|
selector-filter
|
◯
|
◯
|
◯
|
◯
|
◯
|
◯
|
1.5.16. AMQP 0-10 と AMQP 1.0 間のメッセージ変換 リンクのコピーリンクがクリップボードにコピーされました!
content-type と 0-10 ヘッダー内の properties セクション間 message-properties で message-id correlation-id userid、、、および content-encoding マップします。ただし、0-10 は UUID で message-id なければなりません。1.0 メッセージを 0-10 に変換すると、このフィールドに有効な UUID が含まれていない場合は省略されます。
priority フィールドは 0-10 メッセージ delivery-properties の priority フィールドにマップします。1.0 メッセージの durable ヘッダーは 0-10 メッセージ delivery-mode において delivery-properties の値と同等で、true 以前の値は 2 の値で、後者のヘッダーと、false 前者は 1 と同等の値になります。
reply-to routing-keyます。交換が設定されていると、1.0 の reply-to アドレスは交換および任意のルーティングキーから構成されます(フォワードスラッシュで区切ります)。
reply-to アドレスがキューであることを想定していることに注意してください。交換 routing-key 用の 0-10 が 1.0 に正しく変換されるようにするには reply-to、0-10 アドレスでノード種別(例:amq.direct/rk; {node:{type:topic}}')を指定するか、アドレスインスタンスにタイプを設定します。
properties の subject フィールドが 0-10 メッセージの値に設定 routing-key message-properties されます。逆方向では、1.0 メッセージの properties セクションの subject フィールドが 0-10 メッセージ routing-key に設定 message-properties されます。255 文字で routing-key 切り捨てられることに注意してください。
properties セクションの 'to' フィールドに入力されるために使用されますが、逆の変換は行われません(ブローカーから送信されたメッセージの宛先が 0-10 のサブスクリプションによって制御されるため)。
application-properties セクションは 0-10 メッセージ message-properties の application-headers フィールドに変換され、その逆も同様です。
reply-to から 0-10 に変換する場合、アドレスにスラッシュが含まれている場合は、交換/ルーティング キーの形式であることが仮定されます。スラッシュが含まれていない場合、これは単純なノード名になります。その名前が既存のキューと一致する場合、作成される 0-10 の交換は空に reply-to なり、ルーティングキーにキュー名が設定されます。名前が既存のキューに一致せず、名前が交換と一致する場合、交換に reply-to はノード名が設定され、ルーティングキーは空のままになります。ノードが既知のキューや交換を参照しない場合は、空に reply-to なります。
1.5.17. 機能 リンクのコピーリンクがクリップボードにコピーされました!
shared' 機能は、交換からのサブスクリプションを複数のレシーバーで共有できるようにします。これを指定すると、作成されるサブスクリプションキューはリンクの名前になります(コンテナー ID は含まれません)。
durable'' 機能が追加されます。ソースまたはターゲットがキューを参照すると、queue'' 機能が追加されます。ソースまたはターゲットが交換を参照すると、topic'' 機能が追加されます。ソースまたはターゲットがキューを参照する場合や、'legacy-amqp-direct-binding' が直接交換される場合は、追加されます。キューまたはトピックの交換を参照する場合は、'legacy-amqp-topic-binding' が追加されます。
create-on-demand' 機能は、レガシーアプリケーションがメッセージングクライアントで 'create' ポリシーを使用できるようにするエクステンションです。クライアントと名前付きノードが設定されていない場合、ノードは dynamic-node-properties、動的フラグが設定されているのと同じ方法で作成されます。
1.5.18. 機能一致とアサート リンクのコピーリンクがクリップボードにコピーされました!
assert オプションは、0-10 ベースのメカニズムと全く同じではありません。AMQP 1.0 より、クライアントは必要とする機能を設定し、ブローカーは提供可能な機能を設定し、assert オプションが有効になると、クライアントが要求するすべての機能がサポートされます。
durable されている場合、'durable' のケイパビリティーが要求されます(揮発性メモリーが失われた場合、ノードはメッセージを失いません)。
type されている場合、これは要求される性能として渡されます。たとえば、'queue' は、ノードがキューのような特性に対応していることを意味します(コンシューマーが要求し、競合するコンシューマー間でメッセージを割り当てるまでメッセージを保存する)は、ノードが従来の pub-sub 特性に対応していることをtopic意味します。
1.5.19. トピックを使用したサブスクリプションキューの設定 リンクのコピーリンクがクリップボードにコピーされました!
# qpid-config add topic my-topic --argument exchange=amq.topic\
--argument qpid.max_count=500 --argument qpid.policy_type=self-destruct
my-topic/my-key' を 1.0 経由で受信側が確立されると、サブスクリプションキューが 500 メッセージの制限で作成され、その制限を超えると(サブスクリプションが終了して)自体が削除され、キー ' ' で 'amq.topic' にバインドされmy-keyます。
1.6. qpid::messaging Message::get/setContentObject() リンクのコピーリンクがクリップボードにコピーされました!
Message::getContentObject() Message::setContentObject() にアクセスします。これらのメソッドにより、メッセージのボディーにバリアントとしてアクセスまたは操作することができます。これらの方法を使用すると、プロトコルバージョンの両方で機能し、map-、list-、text-、または binary- メッセージの両方で機能するときに、最も広く適用可能なコードが生成されます。
bool Formatter::isMapMsg(qpid::messaging::Message& msg) {
return(msg.getContentObject().getType() == qpid::types::VAR_MAP);
}
bool Formatter::isListMsg(qpid::messaging::Message& msg) {
return(msg.getContentObject().getType() == qpid::types::VAR_LIST);
}
qpid::types::Variant::Map Formatter::getMsgAsMap(qpid::messaging::Message& msg) {
qpid::types::Variant::Map intMap;
intMap = msg.getContentObject().asMap();
return(intMap);
}
qpid::types::Variant::List Formatter::getMsgAsList(qpid::messaging::Message& msg) {
qpid::types::Variant::List intList;
intList = msg.getContentObject().asList();
return(intList);
}
Message::getContent() また、コンテンツの raw バイトを Message::setContent() 引き続き参照します。API の encode() decode() およびメソッドは AMQP 0-10 形式の map- および list- メッセージをデコードし続けます。
第2章 AMQP Model Overview リンクのコピーリンクがクリップボードにコピーされました!
2.1. プロデューサー: コンシューマーモデル リンクのコピーリンクがクリップボードにコピーされました!
2.2. コンシューマー駆動型のメッセージング リンクのコピーリンクがクリップボードにコピーされました!
2.3. Message Producer(Sender) リンクのコピーリンクがクリップボードにコピーされました!
2.4. message リンクのコピーリンクがクリップボードにコピーされました!
2.5. メッセージブローカー リンクのコピーリンクがクリップボードにコピーされました!
2.6. ルーティングキー リンクのコピーリンクがクリップボードにコピーされました!
x-ampq-0.10-routing-key プロパティーがあります。ただし、これは Qpid Messaging API によって管理されるため、このプロパティーを手動でアクセスまたは設定する必要はありません。別の AMQP システムとメッセージを交換する場合に例外があります。この場合、Qpid Messaging API がメッセージおよび送信元のサブジェクトに基づいてこのプロパティーを管理する方法を理解する必要があります。
2.7. メッセージサブジェクト リンクのコピーリンクがクリップボードにコピーされました!
2.8. メッセージプロパティー リンクのコピーリンクがクリップボードにコピーされました!
key:value ペアの一覧です。一部の事前定義されたプロパティーは、メッセージブローカーによって、転送中のメッセージの処理方法を決定するために使用されます。これらのメッセージプロパティーを設定すると、サービスの品質と配信が保証されます。アプリケーション固有の機能には、他のユーザー定義メッセージプロパティーを設定できます。
2.9. connection リンクのコピーリンクがクリップボードにコピーされました!
2.10. session リンクのコピーリンクがクリップボードにコピーされました!
2.11. 交換 リンクのコピーリンクがクリップボードにコピーされました!
2.12. バインディング リンクのコピーリンクがクリップボードにコピーされました!
2.13. トピック リンクのコピーリンクがクリップボードにコピーされました!
qpid-config add topic my-topic --argument exchange=amq.topic\
--argument qpid.max_count=500 --argument qpid.policy_type=self-destruct
my-topic/my-key' を 1.0 経由で受信側が確立されると、サブスクリプションキューが 500 メッセージの制限で作成され、その制限を超えると(サブスクリプションが終了して)自体が削除され、キー ' ' で 'amq.topic' にバインドされmy-keyます。
2.14. domain リンクのコピーリンクがクリップボードにコピーされました!
sasl_mechanisms username, も指定でき passwordます。
qpid-config add domain my-domain --argument url=some.hostname.com:5672
qpid-config add incoming incoming-name --argument domain=my-domain --argument source=queue1 --argument target=queue2
queue1 で特定さ my-domain れたプロセス queue2 でメッセージをプルし、そのメッセージをプルします。
2.15. メッセージキュー リンクのコピーリンクがクリップボードにコピーされました!
--queue-purge-intervalます。これは qpid-config オプションではありませんが、メッセージ TTL を設定でき、パージの試行に成功すると、その後メッセージが削除されます。
2.16. transaction リンクのコピーリンクがクリップボードにコピーされました!
- テキストの一部。
2.17. メッセージコンシューマー(Receiver) リンクのコピーリンクがクリップボードにコピーされました!
第3章 使ってみる リンクのコピーリンクがクリップボードにコピーされました!
3.1. Python を使い始める リンクのコピーリンクがクリップボードにコピーされました!
3.1.1. Python メッセージングの開発 リンクのコピーリンクがクリップボードにコピーされました!
3.1.2. Python クライアントライブラリー リンクのコピーリンクがクリップボードにコピーされました!
python-qpid- Apache Qpid Python クライアントライブラリー。
python-qpid-qmf- QMF(Queue Management Framework)Python クライアントライブラリー。
python-saslwrapper- saslwrapper ライブラリーの Python バインディング。
3.1.3. Python クライアントライブラリーのインストール(Red Hat Enterprise Linux 6) リンクのコピーリンクがクリップボードにコピーされました!
- Red Hat Enterprise Linux Server 6
- Red Hat Enterprise Linux Workstation 6
- Red Hat Enterprise Linux Client 6
yum install python-qpid python-qpid-qmf python-saslwrapper
3.2. .NET を使い始める リンクのコピーリンクがクリップボードにコピーされました!
3.2.1. .NET メッセージング開発 リンクのコピーリンクがクリップボードにコピーされました!
3.2.2. Windows SDK リンクのコピーリンクがクリップボードにコピーされました!
3.2.3. Windows SDK コンテンツ リンクのコピーリンクがクリップボードにコピーされました!
\bin- コンパイルされたバイナリー(.dll および .exe)ファイルと、関連するデバッグプログラムデータベース(.pdb)ファイル。
- ライブラリーファイルを強化します。
- Microsoft Visual Studio ランタイムライブラリーファイル。
\docs- Apache Qpid C++ API リファレンス
\dotnet_examples- Visual Studio ソリューションファイルと関連するプロジェクトファイル。C# の WinSDK の使用を示します。
\examples- 管理されていない C++ で WinSDK を使用するための Visual Studio ソリューションファイルと関連するプロジェクトファイル
\include- .h ファイルのディレクトリーツリー
\lib- /bin 内のファイルに対応するリンカー .lib ファイル
3.2.4. Windows SDK のダウンロードおよびインストール方法 リンクのコピーリンクがクリップボードにコピーされました!
3.2.4.1. Windows SDK の取得 リンクのコピーリンクがクリップボードにコピーされました!
手順3.1 環境の Windows SDK の取得方法
- Red Hat カスタマーポータル にログインします。
A-Zタブをクリックして製品一覧をアルファベット順で並べ替え、選択Red Hat Enterprise MRG Messagingしてダウンロード画面を表示します。- メニューから必要な製品バージョンを選択します。
- メニューから必要なアーキテクチャーを選択します。
- 環境に適した Windows SDK バイナリーを見つけ、をクリックし、ダウンロード を開始します。
3.2.4.2. Windows SDK のインストール リンクのコピーリンクがクリップボードにコピーされました!
- ダウンロードした Windows SDK をファイルシステムに展開します。
- ディレクトリーからエンビロメントの
/bin/Release/ディレクトリーにqpid*、すべてのboost*ファイルをコピーし/bin/Release/ます。
3.3. C++ を使い始める リンクのコピーリンクがクリップボードにコピーされました!
3.3.1. C++ メッセージング開発 リンクのコピーリンクがクリップボードにコピーされました!
3.3.2. Linux 上の C++ リンクのコピーリンクがクリップボードにコピーされました!
3.3.2.1. C++ クライアントライブラリー リンクのコピーリンクがクリップボードにコピーされました!
qpid-cpp-client- Apache Qpid C++ クライアントライブラリー。
qpid-cpp-client-ssl- クライアントの SSL サポート。
qpid-cpp-client-rdma- Qpid クライアントの RDMA プロトコルのサポート(Infiniband を含む)。
qpid-cpp-client-devel- Qpid C++ クライアントを開発するためのヘッダーファイルおよびツール。
qpidd-cpp-client-devel-docs- AMQP クライアント開発ドキュメント。
3.3.2.2. Install C++ Client Libraries(Red Hat Enterprise Linux 6) リンクのコピーリンクがクリップボードにコピーされました!
Red Hat MRG Messaging v.2 (for RHEL-6 Server) チャネルにサブスクライブします。
yum install qpid-cpp-client qpid-cpp-client-rdma qpid-cpp-client-ssl qpid-cpp-client-devel
3.3.2.3. MRG 3 の C++ クライアントライブラリーのインストール リンクのコピーリンクがクリップボードにコピーされました!
Red Hat MRG Messaging v.3 (for RHEL-6 Server) チャネルにサブスクライブします。
yum install qpid-cpp-client qpid-cpp-client-rdma qpid-cpp-client-ssl qpid-cpp-client-devel
3.3.3. Windows 上の C++ リンクのコピーリンクがクリップボードにコピーされました!
3.3.3.1. Windows SDK リンクのコピーリンクがクリップボードにコピーされました!
3.3.3.2. Windows SDK コンテンツ リンクのコピーリンクがクリップボードにコピーされました!
\bin- コンパイルされたバイナリー(.dll および .exe)ファイルと、関連するデバッグプログラムデータベース(.pdb)ファイル。
- ライブラリーファイルを強化します。
- Microsoft Visual Studio ランタイムライブラリーファイル。
\docs- Apache Qpid C++ API リファレンス
\dotnet_examples- Visual Studio ソリューションファイルと関連するプロジェクトファイル。C# の WinSDK の使用を示します。
\examples- 管理されていない C++ で WinSDK を使用するための Visual Studio ソリューションファイルと関連するプロジェクトファイル
\include- .h ファイルのディレクトリーツリー
\lib- /bin 内のファイルに対応するリンカー .lib ファイル
3.3.3.3. Windows SDK のダウンロードおよびインストール方法 リンクのコピーリンクがクリップボードにコピーされました!
3.3.3.3.1. Windows SDK の取得 リンクのコピーリンクがクリップボードにコピーされました!
手順3.2 環境の Windows SDK の取得方法
- Red Hat カスタマーポータル にログインします。
A-Zタブをクリックして製品一覧をアルファベット順で並べ替え、選択Red Hat Enterprise MRG Messagingしてダウンロード画面を表示します。- メニューから必要な製品バージョンを選択します。
- メニューから必要なアーキテクチャーを選択します。
- 環境に適した Windows SDK バイナリーを見つけ、をクリックし、ダウンロード を開始します。
3.3.3.3.2. Windows SDK のインストール リンクのコピーリンクがクリップボードにコピーされました!
- ダウンロードした Windows SDK をファイルシステムに展開します。
- ディレクトリーからエンビロメントの
/bin/Release/ディレクトリーにqpid*、すべてのboost*ファイルをコピーし/bin/Release/ます。
3.4. Java を始める リンクのコピーリンクがクリップボードにコピーされました!
3.4.1. Java クライアントライブラリー リンクのコピーリンクがクリップボードにコピーされました!
qpid-java-client- Qpid クライアントの Java 実装
qpid-java-common- Qpid Java クライアントの共通ファイル
qpid-java-example- プログラミングの例
3.4.2. Java クライアントライブラリーのインストール(Red Hat Enterprise Linux 6) リンクのコピーリンクがクリップボードにコピーされました!
- システムを
Additional Services Channels for Red Hat Enterprise Linux 6 / MRG Messaging v.2 (for RHEL-6 Server)チャネルにサブスクライブします。 - root 権限で以下の yum コマンドを実行します。
yum install qpid-java-client qpid-java-common qpid-java-example
3.5. Ruby を使い始める リンクのコピーリンクがクリップボードにコピーされました!
3.5.1. Ruby メッセージングの開発 リンクのコピーリンクがクリップボードにコピーされました!
3.5.2. Ruby クライアントライブラリー リンクのコピーリンクがクリップボードにコピーされました!
ruby-qpid-qmf- Ruby QMF バインディング
ruby-saslwrapper- saslwrapper ライブラリーの Ruby バインディング
3.5.3. Ruby クライアントライブラリーのインストール(Red Hat Enterprise Linux 6) リンクのコピーリンクがクリップボードにコピーされました!
ruby-qpid-qmf パッケージはメインチャンネルにあります。この ruby-saslwrapper パッケージは Optional 子チャンネルにあります。
- 以下のチャンネルのいずれかにシステムをサブスクライブします。
Red Hat Enterprise Linux Server 6Red Hat Enterprise Linux Client 6Red Hat Enterprise Linux Workstation 6
- root 権限で、以下のコマンドを実行します。
yum install ruby-qpid-qmf - 以下のチャンネルのいずれかをサブスクライブします。
Red Hat Enterprise Linux Optional Server v 6Red Hat Enterprise Linux Optional Client 6Red Hat Enterprise Linux Optional Workstation 6
- root 権限で、以下のコマンドを実行します。
yum install ruby-saslwrapper
3.6. Hello World リンクのコピーリンクがクリップボードにコピーされました!
3.6.1. Red Hat Enterprise Messaging "Hello World" リンクのコピーリンクがクリップボードにコピーされました!
- python
import sys from qpid.messaging import * connection = Connection("localhost:5672") try: connection.open() session = connection.session() sender = session.sender("amq.topic") receiver = session.receiver("amq.topic") message = Message("Hello World!") sender.send(message) fetchedmessage = receiver.fetch(timeout=1) print fetchedmessage.content session.acknowledge() except MessagingError,m: print m connection.close()- C#/.NET
using System; using Org.Apache.Qpid.Messaging; namespace Org.Apache.Qpid.Messaging { class Program { static void Main(string[] args) { String broker = args.Length > 0 ? args[0] : "localhost:5672"; String address = args.Length > 1 ? args[1] : "amq.topic"; Connection connection = null; try { connection = new Connection(broker); connection.Open(); Session session = connection.CreateSession(); Receiver receiver = session.CreateReceiver(address); Sender sender = session.CreateSender(address); sender.Send(new Message("Hello world!")); Message message = new Message(); message = receiver.Fetch(DurationConstants.SECOND * 1); Console.WriteLine("{0}", message.GetContentObject()); session.Acknowledge(); connection.Close(); } catch (Exception e) { Console.WriteLine("Exception {0}.", e); if (connection != null) connection.Close(); } } } }- C++
#include <qpid/messaging/Connection.h> #include <qpid/messaging/Message.h> #include <qpid/messaging/Receiver.h> #include <qpid/messaging/Sender.h> #include <qpid/messaging/Session.h> #include <iostream> using namespace qpid::messaging; int main(int argc, char** argv) { std::string broker = argc > 1 ? argv[1] : "localhost:5672"; std::string address = argc > 2 ? argv[2] : "amq.topic"; Connection connection(broker); try { connection.open(); Session session = connection.createSession(); Receiver receiver = session.createReceiver(address); Sender sender = session.createSender(address); sender.send(Message("Hello world!")); Message message = receiver.fetch(Duration::SECOND * 1); std::cout << message.getContentObject() << std::endl; session.acknowledge(); connection.close(); return 0; } catch(const std::exception& error) { std::cerr << error.what() << std::endl; connection.close(); return 1; } }
3.6.2. Java JMS "Hello World" Program Listing リンクのコピーリンクがクリップボードにコピーされました!
qpid-java-examples パッケージ内の他の例とともに利用できます。
- Java
package org.apache.qpid.example.jmsexample.hello; import javax.jms.*; import javax.naming.Context; import javax.naming.InitialContext; import java.util.Properties; public class Hello { public Hello() { } public static void main(String[] args) { Hello producer = new Hello(); producer.runTest(); } private void runTest() { try { Properties properties = new Properties(); properties.load(this.getClass().getResourceAsStream("hello.properties")); Context context = new InitialContext(properties); ConnectionFactory connectionFactory = (ConnectionFactory) context.lookup("qpidConnectionfactory"); Connection connection = connectionFactory.createConnection(); connection.start(); Session session=connection.createSession(false,Session.AUTO_ACKNOWLEDGE); Destination destination = (Destination) context.lookup("topicExchange"); MessageProducer messageProducer = session.createProducer(destination); MessageConsumer messageConsumer = session.createConsumer(destination); TextMessage message = session.createTextMessage("Hello world!"); messageProducer.send(message); message = (TextMessage)messageConsumer.receive(); System.out.println(message.getText()); connection.close(); context.close(); } catch (Exception exp) { exp.printStackTrace(); } } }
hello.properties。
java.naming.factory.initial
= org.apache.qpid.jndi.PropertiesFileInitialContextFactory
# connectionfactory.[jndiname] = [ConnectionURL]
connectionfactory.qpidConnectionfactory
= amqp://guest:guest@clientid/test?brokerlist='tcp://localhost:5672'
# destination.[jndiname] = [address_string]
destination.topicExchange = amq.topic
3.6.3. "Hello World"──k-through リンクのコピーリンクがクリップボードにコピーされました!
- python
from qpid.messaging import *- C++
#include <qpid/messaging/Connection.h> #include <qpid/messaging/Message.h> #include <qpid/messaging/Receiver.h> #include <qpid/messaging/Sender.h> #include <qpid/messaging/Session.h> using namespace qpid::messaging;- C#/.NET
using Org.Apache.Qpid.Messaging; namespace Org.Apache.Qpid.Messaging {
Connection オブジェクトのインスタンスを作成して取得します。Connection オブジェクトコンストラクターは、ブローカーの URL をパラメーターとして取ります。
- python
connection = Connection("localhost:5672")- C++
Connection connection(broker);- C#/.NET
Connection connection = null; connection = new Connection(broker);
username/password@serverurl:portます。リモートサーバーでこれを試みる場合は、メッセージブローカーでファイアウォールを開いて、ブローカーポートの着信接続を許可するようにしてください。
- C++
Connection connection(broker, "{protocol:amqp1.0}");- C#/.NET
connection = new Connection(broker, "{protocol:amqp1.0}");
open メソッドがあります。
- python
try: connection.open()- C++
try { connection.open();- C#/.NET
connection.Open();
Connection オブジェクトには、Session オブジェクトを返す createSession メソッド(session Python)があるため、以前に作成した接続からセッションを取得します。
- python
session = connection.session()- C++
Session session = connection.createSession();- C#/.NET
Session session = connection.CreateSession();
Session オブジェクトには sender、receiver ターゲットアドレスまたはソースアドレスをパラメーターとして取り、それぞれと Receiver オブジェクト Sender を返すメソッドがあります。メッセージは送受信する必要があるオブジェクトであるため、セッションの各メソッドを呼び出して作成します。このデモに amq.topic 交換を使用します。これはブローカーで事前設定された交換であるため、作成は不要で、その存在に依存します。
- python
sender = session.sender("amq.topic") receiver = session.receiver("amq.topic")- C++
Receiver receiver = session.createReceiver(address); Sender sender = session.createSender(address);- C#/.NET
Receiver receiver = session.CreateReceiver(address); Sender sender = session.CreateSender(address);
amq.topic 交換にメッセージをルーティングします。ルーティングターゲットは交換であるため、ブローカーによってさらにルーティングされます。
amq.topic 交換にメッセージを送信し、受信側がキューで受信することを示すのに十分です。
Message オブジェクトは、message.content以下の文字列となる文字列のコンストラクターにパラメーターとして取ります。
- python
message = Message("Hello World!")
Message を message.content 介して設定した content-type 場合、オブジェクトコンストラクターが正しい値を設定します。ただし、プロパティーに値を割り当てることで Message オブジェクトの作成後にこれを設定した場合は、message.content プロパティーを message.content_type 適切に設定する必要があります。
send メソッドを使用して、メッセージをブローカーに送信することができます。
- python
sender.send(message)- C++
sender.send(Message("Hello world!"));- C#/.NET
sender.Send(new Message("Hello world!"));
amq.topic 交換にメッセージが送信されます。
amq.topic 交換にサブスクライブしました。このメッセージは、このキューで待機します。
fetch 方法を使用して、ブローカーからメッセージを取得します。
- python
fetchedmessage = receiver.fetch(timeout=1)- C++
Message message = receiver.fetch(Duration::SECOND * 1);- C#/.NET
Message message = new Message(); message = receiver.Fetch(DurationConstants.SECOND * 1);
timeout パラメーターは、メッセージを待つ fetch 時間を指定します。タイムアウトを設定しないと、受信側はキューにメッセージが表示されるまで無期限に待機します。タイムアウトを 0 に設定すると、受信側はキューを確認し、何もなければすぐに返します。メッセージをルーティングしてキューに表示するのに十分な時間を確保するために、これを 1 秒でタイムアウトに設定します。
Message オブジェクトを Fetch 返すため、content プロパティーを出力します。
- python
print fetchedmessage.content- C++
std::cout << message.getContent() << std::endl;- C#/.NET
Console.WriteLine("{0}", message.GetContent());
- python
session.acknowledge()- C++
session.acknowledge();- C#/.NET
session.Acknowledge();
- python
except MessagingError,m: print m connection.close()- C++
} catch(const std::exception& error) { std::cerr << error.what() << std::endl; connection.close(); return 1; }- C#/.NET
} catch (Exception e) { Console.WriteLine("Exception {0}.", e); if (connection != null) connection.Close(); }
helloworld.py、コマンドを使用して実行し python helloworld.pyます。メッセージブローカーがローカルマシンで実行されている場合は、プログラムリストに「Hello World!」という単語が表示されるはずです。
第4章 "Hello World" を超える リンクのコピーリンクがクリップボードにコピーされました!
4.1. サブスクリプション リンクのコピーリンクがクリップボードにコピーされました!
amq.topic 交換をリッスンするレシーバーを作成しました。バックグラウンドでは、キューと amq.topic 交換を作成 subscribes します。Hello World プログラム送信者は amq.topic 交換に パブリッシュ します。amq.topic 交換はデモに使用するのが適切です。トピック交換では、交換に送信されるメッセージサブジェクトのフィルターとして機能する バインディングキー を使用して(交換と バインド )キューをサブスクライブできます。バインディングキーがない交換にバインドするため、交換を介して送信されるすべてのメッセージに関心があることを通知します。
amq.topic 交換すると、メッセージは受信側のサブスクリプションキューに送信されます。その後、受信側がサブスクリプションキューからメッセージ fetch() を取得するよう呼び出します。
amq.topic 交換に送信します。送信 後、受信側を交換に登録します。
- python
sender = session.sender("amq.topic") receiver = session.receiver("amq.topic") message = Message("Hello World!") sender.send(message)- C++
Session session = connection.createSession(); Receiver receiver = session.createReceiver(address); Sender sender = session.createSender(address); sender.send(Message("Hello world!"));- C#/.NET
Session session = connection.CreateSession(); Receiver receiver = session.CreateReceiver(address); Sender sender = session.CreateSender(address); sender.Send(new Message("Hello world!"));
- python
sender = session.sender("amq.topic") message = Message("Hello World!") sender.send(message) receiver = session.receiver("amq.topic")- C++
Session session = connection.createSession(); Sender sender = session.createSender(address); sender.send(Message("Hello world!")); Receiver receiver = session.createReceiver(address);- C#/.NET
Session session = connection.CreateSession(); Sender sender = session.CreateSender(address); sender.Send(new Message("Hello world!")); Receiver receiver = session.CreateReceiver(address);
amq.topic 交換に公開しました。その後、交換によって、サブスクライブされたすべてのキューにメッセージが配信されましたが、これはありませんでした。レシーバーが交換にサブスクライブしている場合は、メッセージを受信するには時間がかかりません。元のバージョンのプログラムでは、受信側がメッセージを送信する前に交換にサブスクライブし、そのサブスクリプションキューでメッセージのコピーを受け取ります。
durable キューはすべて破棄されます)。次に、以下のコマンドを実行します。
qpid-config queues
raw_input 方法を使用してキーボード入力を取得します。
- python
sender = session.sender("amq.topic") receiver = session.receiver("amq.topic") print "Press Enter to continue" x= raw_input() message = Message("Hello World!") sender.send(message)
qpid-config queues
amq.topic 交換にバインドされ、受信側が交換からメッセージを受信できるようにするキューです。また、その最後に同じ ID 番号を持つ他のキューも多数表示されます。これらは、qpid-config ユーティリティーがメッセージブローカーをクエリーし、コマンドを実行するキューの一覧を受信するために使用するキューです。このコマンドを再度実行すると、弊社のレシーバーキューは同じままで、他のキューには新しい ID が設定されています。qpid-config コマンドを実行するたびに、サーバーに応答を受け取るために独自のキューが作成されます。実行していない場合は、キューを表示するために実行する必要があるため qpid-config、これらのキューが存在していないと認識できませんが、この qpid-config キューの用語を取ることができます。
- バージョン 2.2 以降
- queue-exchange バインディングを表示するには、以下を実行します。
qpid-config queues -b-b スイッチにはバインディングが表示されます。動的に作成された 2 つのキューがamq.topic交換にバインドされていることを確認できます。 - バージョン 2.3 以降
- queue-exchange バインディングを表示するには、以下を実行します。
qpid-config queues -r-r スイッチにはバインディングが表示されます。動的に作成された 2 つのキューがamq.topic交換にバインドされていることを確認できます。
connection.close() 終了する呼び出しと、ブローカーの排他的キューが 2 つ削除されます。qpid-config queues 再度実行して確認します。
amq.topic 交換と対話します。このキューはプライベート(およびという名前 exclusive)であり、コンシューマーが切断されると削除されるため、パブリッシュには適していません。メッセージの送信時に交換に接続されている可能性のあるコンシューマーがメッセージを利用できるようにするには、メッセージ作成アプリケーションが公開されているキュー(公開)を作成する必要があります。消費アプリケーションは、この公開キューにサブスクライブし、切り離された方法でメッセージを受信できます。
4.2. パブリッシュ リンクのコピーリンクがクリップボードにコピーされました!
4.3. AMQP Exchange タイプ リンクのコピーリンクがクリップボードにコピーされました!
- direct
- Direct Exchange を使用すると、コンシューマーはキューをキーにバインドできます。ダイレクトタイプの交換によってメッセージが受信された場合、メッセージはバインディングキーがメッセージの件名と一致するキューにルーティングされます。Direct Exchange は排他的バインディングもサポートし、キューが交換に送信されたメッセージを所有し、単純なダイレクトツーキューモデルを実装することができます。
- トピック
- Topic Exchange を使用すると、コンシューマーはワイルドカード一致を指定するキーを使用してキューをバインドできます。ワイルドカードは、交換に送信されたメッセージの件名と照合されます。これにより、トピックの交換と異なるバインディングキーを持つさまざまなキューを使用して、メッセージフィルタリングパターンを実装できます。
4.4. 事前設定された交換 リンクのコピーリンクがクリップボードにコピーされました!
- デフォルトの交換
- 名前なしの直接交換。デフォルトではすべてのキューはこの交換にバインドされ、キュー名でアクセスできるようになります。
amq.direct- 事前設定されたダイレクト交換。
amq.fanout- 事前設定されたジャンクアウト交換。
amq.match- 事前設定されたヘッダー交換。
amq.topic- 事前設定されたトピック交換。
4.5. Exchange サブスクリプションパターン リンクのコピーリンクがクリップボードにコピーされました!
- メッセージのコピー
- メッセージの移動
- 排他的バインディング
メッセージのコピー
メッセージのコピーは、各コンシューマーがすべてのメッセージの独自のコピーを取得する場所です。
メッセージの移動
メッセージの移行では、複数のコンシューマーが同じキューに接続し、ラウンドロビン方式でキューからメッセージを取得する場合です。
排他的バインディング
3 つ目のパターンの exclusive バインディングは、コンシューマーのみがエンドポイントにルーティングされるメッセージにアクセスできることについて規定しています。
4.6. デフォルトの交換 リンクのコピーリンクがクリップボードにコピーされました!
4.6.1. デフォルトの交換 リンクのコピーリンクがクリップボードにコピーされました!
4.6.2. デフォルト交換を使用したキューへの公開 リンクのコピーリンクがクリップボードにコピーされました!
qpid-config add queue quick-publish
{create: always} 場合、キューが存在しない場合は作成されます。さらに always、create コマンドは引数を取り、送信側がアドレスに接続 sender した場合に限りキューを作成するか receiver、受信側がそのアドレスに接続する場合にのみキューを作成するように指定することもできます。
- python
sender = session.sender("quick-publish; {create: always}")- C++
Sender sender = session.createSender("quick-publish; {create: always}")
4.6.3. デフォルトの交換のサブスクライブ リンクのコピーリンクがクリップボードにコピーされました!
quick-publish」にサブスクライブするには、以下を実行します。
- C++
Receiver receiver = session.createReceiver('quick-publish');- python
receiver = session.receiver('quick-publish')
quick-publish キューからメッセージを取得できるようになりました。
- C++
Receiver receiver = session.createReceiver('quick-publish; {mode: browse}');- python
receiver = session.receiver('quick-publish; {mode: browse}')
create パラメーターを使用します。
- C++
Receiver receiver = session.createReceiver("my-own-copies-please; {create: always, node: {type: 'queue'}}");- python
receiver = session.receiver("my-own-copies-please; {create: always, node: {type: 'queue'}}")
my-own-copies-please"" がすでに存在する場合、受信側はそのキューに接続します。キューが存在しない場合は、作成されます(すべての例では、十分な権限が想定されます)。
my-own-copies-please」という 交換 が存在する場合は、キューを作成する代わりに受信側がそのアドレスに警告して接続する点が 1 つあります。これは意図したものではなく、予測できない結果となります。これを回避するには、以下のように assert パラメーターを使用します。
- C++
try { Receiver receiver = session.createReceiver("my-own-copies-please; {create: always, assert: always, node: {type: 'queue'}}"); } catch(const std::exception& error) { std::cerr << error.what() << std::endl; }- python
try: receiver = session.receiver("my-own-copies-please; {create: always, assert: always, node: {type: 'queue'}}") except MessagingError m: print m
my-own-copies-please」がすでに存在していて交換されている場合は、レシーバーコンストラクターが例外「expected queue, got topic」を出力します。
4.7. 直接交換 リンクのコピーリンクがクリップボードにコピーされました!
4.7.1. 直接交換 リンクのコピーリンクがクリップボードにコピーされました!
図4.1 直接交換
4.7.2. qpid-config を使用した直接交換の作成 リンクのコピーリンクがクリップボードにコピーされました!
engineeringます。
qpid-config add exchange direct engineering
4.7.3. アプリケーションからの直接交換の作成 リンクのコピーリンクがクリップボードにコピーされました!
engineeringます。
- python
sender = session.sender('engineering;{create: always, node:{type:topic, x-declare:{type:direct}}}')
engineering すでにという名前の交換が存在する場合は、送信者は新しいものを作成しようとはしませんが、既存のに接続します。ただし、名前のキューが engineering すでに存在する場合、送信者はその キュー にサイレントに接続するため、注意が必要です。
engineering、以下の例の assertように使用できます。
- python
try: sender = session.sender('engineering;{create: always, node:{type:topic, x-declare:{type:direct}}, assert: always}') except MessagingError, m: print m
engineering 存在しキューである assert: always, node: {type: topic}場合、送信元コンストラクターによって例外が「expected topic, got queue」という例外が発生します。
assert するために使用できますが、その交換の タイプ を確認することはできません。
4.7.4. 直接交換への公開 リンクのコピーリンクがクリップボードにコピーされました!
特定のエンドポイントをターゲットとする送信者を作成します。
最初に、メッセージを公開先のエンドポイントに直接ルーティングする送信者を作成します。直接交換には完全一致が必要であるため、特定の送信先に送信する必要があります。同時に、複数のキューを交換にバインドして、同じ宛先にルーティングされたメッセージを受信できることに注意してください。そのため、複数のコンシューマーを持つ特定のエンドポイントになります。
qpid-config add exchange direct finance
- python
sender = session.sender('finance;{create:always, node: {type: topic, x-declare: {type: direct}}}')
finance 交換の reports エンドポイントにメッセージをルーティングする送信者を作成します。
- python
sender = session.sender('finance/reports') sender.send('Message to all consumers bound to finance with key reports')
finance 直接交換にバインドされたキューに sender 移動 reportsします。
交換をターゲットとする送信者を作成します。
2 つ目のオプションは、メッセージを交換にルーティングする送信者を作成し、メッセージサブジェクトを使用して特定のエンドポイントへのルーティングを制御することです。これにより、たとえば、ランタイムで提供されるキーの名前(他のメッセージのボディーにある場合など)に基づいて、メッセージの移動先を動的に決定できます。
- python
sender = session.sender('finance; {assert: always, node: {type: topic}}') msg = Message('Message to all consumers bound to finance with key reports') msg.subject = 'reports' sender.send(msg)
subjectます。メッセージを送信する前に、サブジェクトを変更することで、その交換で異なるエンドポイントをターゲットにすることができます。たとえば、同じメッセージのコピーをおよびに送信するには、以下を finance/reports finance/records行います。
- python
sender = session.sender('finance; {assert: always, node: {type: topic}}') msg = Message('Message for reports and records') msg.subject = 'reports' sender.send(msg) msg.subject = 'records' sender.send(msg)
{assert: always, node: {type: topic}} デフォルトの交換に finance バインドされた名前のキューに誤って接続しないようにします。キューと交換には個別の namespace がありますが、デフォルトの交換は名前なしであることに注意してください。
注意事項
2 つ目のケースで確認できるように、メッセージのルーティング先に影響するサブジェクトを設定します。最初の方法(アドレス内のサブジェクトと送信者)を使用する場合は、メッセージサブジェクトを誤って設定しないように注意してください。メッセージサブジェクトが空白の場合に送信時に、送信元は正しいサブジェクトをメッセージに書き込みます。ただし、指定するメッセージサブジェクトは上書きされません。最初のメソッド - 送信側のアドレスで、メッセージのサブジェクトが設定されていないすべてのメッセージの「デフォルト宛先」を提供します。メッセージの送信前にサブジェクトを明示的に設定すると、交換上の他のエンドポイントをターゲットにすることができます。この場合、カスタムサブジェクトに基づいて追加のルーティングのために交換に送信されます。メッセージサブジェクトを設定するとルーティングが決定されることに注意してください。
4.7.5. 直接交換のサブスクライブ リンクのコピーリンクがクリップボードにコピーされました!
メッセージのコピーを使用したデフォルト交換へのサブスクライブ
これは、実装する最も簡単な方法です。交換名とルーティングキーで構成されるアドレスを使用して受信側を作成します。たとえば、対象のreportsキーを使用して、直接交換finance"" にレシーバーを作成します。
- C++
Receiver receiver = session.createReceiver("finance/reports")- python
receiver = session.receiver('finance/reports')
共有キューを使用した直接交換のサブスクライブ
共有キューを使用したサブスクリプションは、サブスクリプションキューに命名して、特別でないものを定義することで作成できます。例:
- C++
Receiver receiver = session.createReceiver("finance/quick-publish;{link:{name:my-subscription, x-declare:{exclusive:False}}}");- python
receiver = session.receiver('finance/quick-publish;{link:{name:my-subscription, x-declare:{exclusive:False}}}')
x-bindingsます。例:
- C++
Receiver receiver = session.createReceiver("my-subscription;{create: always, node:{x-bindings: [{exchange: 'finance', key: 'quick-publish'}]}}");- python
receiver = session.receiver('my-subscription;{create: always, node:{x-bindings: [{exchange: 'finance', key: 'quick-publish'}]}}')
my-subscription」という名前の共有キューを作成し、キー "" で直接交換finance"" にバインドしましたquick-publish。
AMQP 1.0
AMQP 1.0 では Link-scoped x-declare および Node-scoped x-bindings 句の両方に対応していないため、共有サブスクリプションのケイパビリティーをリクエストします。
- C++
Receiver receiver = session.createReceiver("finance/quick-publish;{node: {capabilities:[shared]}, link: {name: 'my-subscription'}}");
4.7.6. 直接交換の排他的バインディング リンクのコピーリンクがクリップボードにコピーされました!
qpid.exclusive-binding は、排他的バインディングを宣言するために使用されます。
drain -f "amq.direct; {create:always, link: {name:one, x-bindings:[{key:unique, arguments: {qpid.exclusive-binding:True}}]}}"
4.8. FANout Exchange リンクのコピーリンクがクリップボードにコピーされました!
4.8.1. 事前設定された交換 リンクのコピーリンクがクリップボードにコピーされました!
amq.fanoutます。
4.8.2. FANout Exchange リンクのコピーリンクがクリップボードにコピーされました!
図4.2 FANout Exchange
# としてワイルドカードを使用します。
4.8.3. qpid-config を使用した交換の作成 リンクのコピーリンクがクリップボードにコピーされました!
qpid-config add exchange fanout my-fanout-exchange
durable (ブローカーを再起動する間)交換を行うには、--durable オプションを使用します。
qpid-config add exchange fanout my-fanout-exchange --durable
4.8.4. アプリケーションからの交換の作成 リンクのコピーリンクがクリップボードにコピーされました!
create: alwaysnode: {type: topic, x-declare: {exchange: exchange-name, type: fanout}}
myfanoutます。
- python
tx = ssn.sender("myfanout; {create: always, node: {type: topic, x-declare: {exchange: myfanout, type: fanout}}}")
4.8.5. 送信交換を使用した複数キューへの公開 リンクのコピーリンクがクリップボードにコピーされました!
- python
import sys from qpid.messaging import * con = Connection("localhost:5672") con.open() try: ssn = con.session() tx = ssn.sender("amq.fanout") tx.send("Hello to all consumers bound to the amq.fanout exchange") finally: con.close()
4.8.6. 交換のサブスクライブ リンクのコピーリンクがクリップボードにコピーされました!
- 一時サブスクリプションを使用して交換にサブスクライブします。これにより、アプリケーションが切断されたときに破棄される一時的なプライベートキューが作成され、バインドされます。このアプローチは、複数のコンシューマー間でメッセージの責任を共有する必要がない場合や、アプリケーションが稼働していない場合や切断された時に送信されるメッセージを重要としない場合に合理的です。
- 交換にバインドされたキューにサブスクライブします。これにより、アプリケーションが切断されている場合はキューでメッセージをバッファーでき、キュー内のメッセージに対する責任を複数コンシューマーが共有できるようになります。
プライベート、一時サブスクリプション
プライベートで一時サブスクリプションを実装するには、Fluentout 交換の名前を使用して受信側のアドレスとしてレシーバーを作成します。例:
- python
rx = receiver("amq.fanout")
共有可能なサブスクリプション
コンシューマーアプリケーションを再起動しても維持される共有可能なサブスクリプションを実装するには、キューを作成し、そのキューにサブスクライブします。
qpid-config add queue shared-q
qpid-config bind amq.fanout shared-q
--durable オプションを使用します。
- python
rx = receiver("shared-q")
AMQP 0-10
- python
rx = receiver("shared-q;{create: always, link: {x-bindings: [{exchange: 'amq.fanout', queue: 'shared-q'}]}}")
AMQP 1.0
- C++
Receiver receiver = session.createReceiver("amq.fanout;{node: {capabilities:[shared]}, link: {name: 'shared-q'}}");
4.9. トピック交換 リンクのコピーリンクがクリップボードにコピーされました!
4.9.1. 事前設定されたトピック交換 リンクのコピーリンクがクリップボードにコピーされました!
amq.topicます。
4.9.2. トピック交換 リンクのコピーリンクがクリップボードにコピーされました!
図4.3 トピック交換
ワイルドカード一致とトピック交換
バインディングキーでは、任意の数のピリオド用語に # 一致し、1 つの用語に * 一致します。
#.news は usa.news およびなどのサブジェクトとメッセージに一致し germany.europe.news、のバインディングキーはサブジェクトとメッセージに *.news 一致しますが usa.news、バインディングキーはメッセージとサブジェクトに一致しません germany.europe.news。
4.9.3. qpid-config を使用したトピック交換の作成 リンクのコピーリンクがクリップボードにコピーされました!
newsます。
qpid-config add exchange topic news
4.9.4. アプリケーションからのトピック交換の作成 リンクのコピーリンクがクリップボードにコピーされました!
newsます。
- python
txtopic = ssn.sender("news; {create: always, node: {type: topic}}")
4.9.5. トピック交換への公開 リンクのコピーリンクがクリップボードにコピーされました!
news トピックの交換に送信されます。
- python
import sys from qpid.messaging import * conn = Connection("localhost:5672") conn.open() try: ssn = conn.session() txnews = ssn.sender("news; {create: always, node: {type: topic}}") msg = Message("News about Europe") msg.subject = "europe.news" txnews.send(msg) msg = Message("News about the US") msg.subject = "usa.news" txnews.send(msg) finally: conn.close()
4.9.6. トピック交換のサブスクライブ リンクのコピーリンクがクリップボードにコピーされました!
news し everything.news、一致するワイルドカードで amq.topic 交換にバインドします。ここでは、すべて がピリオドの用語です。
qpid-config add queue news
qpid-config bind amq.topic news "#.news"
.news以下で終わるすべてのメッセージの news キューをリッスンできます。
- python
rxnews = ssn.receiver("news")
AMQP 0-10
- python
rxnews = ssn.receiver("news;{create: always, node: {type:queue}, link:{x-bindings:[{exchange: 'amq.topic', queue: 'news', key: '#.news'}]}}")
AMQP 1.0
- C++
Receiver rxnews = ssn.createReceiver("amq.topic/#.news;{node:{capabilities:[shared]}, link:{name: 'news'}}");
- python
rxnews = ssn.receiver("amq.topic/#.news");
# シンボルは任意の数のピリオド用語に一致します。# は 1 つの用語に一致します。
4.10. ヘッダー交換 リンクのコピーリンクがクリップボードにコピーされました!
4.10.1. 事前設定されたヘッダー交換 リンクのコピーリンクがクリップボードにコピーされました!
amq.matchます。
4.10.2. ヘッダー交換 リンクのコピーリンクがクリップボードにコピーされました!
4.10.3. qpid-config を使用したヘッダー交換の作成 リンクのコピーリンクがクリップボードにコピーされました!
property-matchます。
qpid-config add exchange headers property-match
4.10.4. アプリケーションからのヘッダー交換の作成 リンクのコピーリンクがクリップボードにコピーされました!
headers-matchます。
- python
txheaders = ssn.sender("headers-match;{create: always, node: {type: topic, x-declare: {exchange: headers-match, type: headers}}}")
4.10.5. ヘッダー交換への公開 リンクのコピーリンクがクリップボードにコピーされました!
propertiesます。例:
- python
import sys from qpid.messaging import * conn = Connection("localhost:5672") conn.open() try: ssn = conn.session() txheaders = ssn.sender("amq.match") msg = Message("Headers Exchange message") msg.properties['header1'] = 'value1' txheaders.send(msg) finally: ssn.close()
4.10.6. ヘッダー交換のサブスクライブ リンクのコピーリンクがクリップボードにコピーされました!
- 変更
- 2013 年 4 月更新されました。
- 2013 年 7 月の更新
match-q、値がのヘッダーキーを header1 持つメッセージに一致するバインディングキーを使用して、amq.match 交換にサブスクライブし value1ます。
AMQP 0-10
- python
rxheaders = ssn.receiver("match-q;{create: always, node: {type: queue}, link:{x-bindings:[{key: 'binding-name', exchange: 'amq.match', queue: 'match-q', arguments:{'x-match': 'any', 'header1': 'value1'}}]}}")
AMQP 1.0
- C++
Receiver rxheaders = ssn.createReceiver("amq.match; {link: {name:match-q, filter:{value:{'x-match': 'any', 'header1': 'value1'}, name: headers, descriptor:'apache.org:legacy-amqp-headers-binding:map'}}}");
x-match 引数は any、バインディングのキーと値 の ペアを持つメッセージと一致する値を取るか all、またはヘッダーのバインディングキーから すべて のキーと値のペアを持つメッセージと一致する値を取ることができます。
x-binding、フィルターが使用されます。
x-binding。x-bindings 引数に注意してください key。この引数はバインディングの名前付きハンドルを作成します。これは、実行時に表示され qpid-config exchanges -rます。ハンドルがない場合、バインディングは名前で削除できません。null キーは有効ですが、名前で名前で削除できないだけでなく、ハンドルを使用してバインディングを作成すると、null その交換で null ハンドルでバインディングを作成しようとすると、新しいバインディングを作成するのではなく、既存のバインディングが更新されます。
4.11. XML 交換 リンクのコピーリンクがクリップボードにコピーされました!
4.11.1. カスタムの交換タイプ リンクのコピーリンクがクリップボードにコピーされました!
4.11.2. 事前設定された XML 交換タイプ リンクのコピーリンクがクリップボードにコピーされました!
4.11.3. XML 交換の作成 リンクのコピーリンクがクリップボードにコピーされました!
myxmlます。
qpid-config add exchange xml myxml
- python
tx = ssn.sender("myxml; {create: always, node: {type: topic, x-declare: {exchange: myxml, type: xml}}}")
4.11.4. XML Exchange のサブスクライブ リンクのコピーリンクがクリップボードにコピーされました!
myxml し、XQuery xmlq と交換にバインドすることで XML 交換にサブスクライブします。
AMQP 0-10
- python
rxXML = ssn.receiver("myxmlq; {create:always, link: { x-bindings: [{exchange:myxml, key:weather, arguments:{xquery:'./weather'} }]}}")
AMQP 1.0
- C++
Receiver rxXML = ssn.createReceiver("myxml/weather; {link: {name:myxmlq, filter:{name:myfilter, descriptor:'apache.org:query-filter:string', value:'./weather'}}}");
./weather は、ボディーコンテンツがルート XML 要素を持つすべてのメッセージと一致し <weather>ます。
key 引数に注意してください x-bindings。これにより、バインディングに一意の名前があり、名前で削除および更新でき、交換の namespace で匿名であった場合のように、誤って更新されないようにします。
- python
#!/usr/bin/python import sys from qpid.messaging import * conn = Connection("localhost:5672") conn.open() try: ssn = conn.session() tx = ssn.sender("myxml/weather; {create: always, node: {type: topic, x-declare: {exchange: myxml, type: xml}}}") xquerystr = 'let $w := ./weather ' xquerystr += "return $w/station = 'Raleigh-Durham International Airport (KRDU)' " xquerystr += 'and $w/temperature_f > 50 ' xquerystr += 'and $w/temperature_f - $w/dewpoint > 5 ' xquerystr += 'and $w/wind_speed_mph > 7 ' xquerystr += 'and $w/wind_speed_mph < 20' rxaddr = 'myxmlq; {create: always, ' rxaddr += 'link: {x-bindings: [{exchange: myxml, ' rxaddr += 'key: weather, ' rxaddr += 'arguments: {xquery: "' + xquerystr + '"' rxaddr += '}}]}}' rx = ssn.receiver(rxaddr) msgstr = '<weather>' msgstr += '<station>Raleigh-Durham International Airport (KRDU)</station>' msgstr += '<wind_speed_mph>16</wind_speed_mph>' msgstr += '<temperature_f>70</temperature_f>' msgstr += '<dewpoint>35</dewpoint>' msgstr += '</weather>' msg = Message(msgstr) tx.send(msg) rxmsg = rx.fetch(timeout=1) print rxmsg ssn.acknowledge() finally: conn.close()
第5章 メッセージ配信と許可 リンクのコピーリンクがクリップボードにコピーされました!
5.1. メッセージライフサイクル リンクのコピーリンクがクリップボードにコピーされました!
5.1.1. メッセージ配信の概要 リンクのコピーリンクがクリップボードにコピーされました!
図5.1 FANout Exchange
message.subject、ルーティングキー(2)として機能するを設定し、メッセージをブローカー(3)に送信します。
5.1.2. メッセージの生成 リンクのコピーリンクがクリップボードにコピーされました!
Message オブジェクトは、メッセージを生成するために使用されます。
- python
import sys from qpid.messaging import * ... msg = Message('This is the message content') msg.content = 'Message content can be assigned like this' msg.properties['header-key'] = 'value' tx = ssn.sender('amq.topic') # msg.subject set by sender for routing purposes tx.send(msg) msg.subject = 'Messaging Routing Key can also be manually set' # beware that this will interfere with sender-object-based routing
5.1.3. 信頼性のあるリンク上でメッセージを送信する リンクのコピーリンクがクリップボードにコピーされました!
- 送信側はメッセージをブローカーに渡します。
- ブローカーは、メッセージの配信に責任があることを確認応答します。
- 送信側はメッセージのローカルコピーを削除します。
5.1.4. 信頼性のないリンク上でメッセージを送信する リンクのコピーリンクがクリップボードにコピーされました!
- 送信側はメッセージをブローカーに渡します。
- 送信側はメッセージのローカルコピーを削除します。
5.1.5. Broker のメッセージ配布 リンクのコピーリンクがクリップボードにコピーされました!
5.1.6. 信頼性のあるリンクのメッセージ受信 リンクのコピーリンクがクリップボードにコピーされました!
- ブローカーはメッセージをレシーバーに渡します。
- 受信側はメッセージの 責任 を承認します。この場合、ブローカーはメッセージのサーバー側のコピーを削除します。
- レシーバーはメッセージを 拒否 します。この場合、ブローカーはメッセージをキューに定義された
alternate-exchange場合にメッセージをルーティングするか、メッセージを破棄します。 - レシーバーはメッセージを 解放 します。この場合、ブローカーはメッセージヘッダーのあるキューにメッセージを返し
redelivered:trueます。 - メッセージの承認または拒否なしで受信側が切断されます。この場合、ブローカーはメッセージヘッダーのあるキューにメッセージを返し
redelivered:trueます。
5.1.7. 信頼性のないリンク上のメッセージ受信 リンクのコピーリンクがクリップボードにコピーされました!
- ブローカーはメッセージをレシーバーに渡します。
- ブローカーはメッセージのサーバー側のコピーを削除します。
5.2. メッセージの閲覧とコンシューマー リンクのコピーリンクがクリップボードにコピーされました!
5.2.1. メッセージ取得および許可 リンクのコピーリンクがクリップボードにコピーされました!
閲覧
含まれる drain プログラムは、browse モードまたは layers モードのいずれかで使用できます。
/usr/share/doc/python-qpid-0.14/examples/api/drain
/usr/share/qpidc/examples/messaging/drain.cpp
qpid-config add queue browse-acquire-demo
browse-acquire-demo キューが表示されるはずです qpid-config queues。
browse-acquire-demo 使用方法にメッセージを送信し spoutます Spout。はと同じパッケージに含まれ drain、同じディレクトリーにあります。spout を実行してメッセージをキューに送信します。
./spout browse-acquire-demo "Hello World"
browse-acquire-demo キューに送信されました。ドレイン(解放)を使用して、すべての最初の 1 つを 参照し ます。
./drain -c 0 "browse-acquire-demo; {mode:browse}"
browse-acquire-demo キューの削除を試行します。
qpid-config del queue browse-acquire-demo
./drain -c 0 "browse-acquire-demo"
qpid-config del queue browse-acquire-demo
- python
import sys from qpid.messaging import * def msgfetch(rx): try: msg = rx.fetch(timeout=1) except MessagingError, m: msg = m return msg connection = Connection("localhost:5672") connection.open() try: session = connection.session() tx = session.sender("browse-acquire-demo;{create:always}") rxbrowse1 = session.receiver("browse-acquire-demo;{mode:browse}") rxbrowse2 = session.receiver("browse-acquire-demo;{mode:browse}") rxbrowse3 = session.receiver("browse-acquire-demo;{mode:browse}") rxacquire = session.receiver("browse-acquire-demo") tx.send("Hello World") print "\nBrowser 1 saw message:" print msgfetch(rxbrowse1) print "Browser 1 then saw message:" print msgfetch(rxbrowse1) print "\nBrowser 2 saw message:" print msgfetch(rxbrowse2) print "Browser 2 then saw message:" print msgfetch(rxbrowse2) print "\nAcquired message:" print msgfetch(rxacquire) print "\nBrowser 3 saw message:" print msgfetch(rxbrowse3) except MessagingError, m: print m finally: connection.close()
./drain -c 0 browse-acquire-demo
取得および承認
レシーバーがキューからメッセージを取得すると、ブローカーはメッセージをに設定し acquiredます。メッセージがある場合 acquired、ブローカーはメッセージを配信されたかのように処理しますが、キューから削除されません。メッセージを受信したコンシューマーがメッセージを承認するか、メッセージを 解放 するか、メッセージ を 拒否 するか、コンシューマーがネットワーク障害で切断する可能性があります。
acquired、メッセージコンシューマーがキューからアクセスまたはフェッチしてもメッセージは表示されません。受信を許可せずにアプリケーションが切断されると、ブローカーはメッセージを acquired 状態から切り替え、ヘッダーを設定し redelivered=Trueます。その後、アプリケーションを閉じた後に実行した drain ブラウザーなど、他のコンシューマーがメッセージを利用できるようになります。
redelivered=true' のキューからメッセージを取得します。このアラートは、このメッセージがすでに動作している 可能性 がある他のノードに警告し、チェックを実行して、それを確認します。これにより、アプリケーションがこの機能を活用するように設計された場合でも、例外のウィンドウが制限されます。
connection.close() 行の後に以下のコードをアプリケーションの最後に追加します。
- python
connection.open() try: session=connection.session() rxacquire2 = session.receiver("browse-acquire-demo") print "\nAcquirer 2 saw message:" print msgfetch(rxacquire2) except MessagingError, m: print m finally: session.acknowledge() connection.close()
redelivered を以前に取得したことを通知します。これでこのメッセージを取得し、他のコンシューマーがこのキューを閲覧したりフェッチしたりするために、このメッセージを再取得します。ただし、今回は接続を閉じる session.acknowledge() 前に呼び出します。このメソッドはメッセージの受信を認識します(すべてのメッセージはセッションに対して承認されていないものとして確認されます)。メッセージへの受信は確認済みなので、メッセージはキューから削除され acquiredています。
メッセージの解放
コンシューマーはメッセージを明示的に リリース できます。これが発生すると、メッセージは再配信のキューに返されます。この効果は、コンシューマーがブローカーへの接続を失うかどうかと同じです。
Disposition(RELEASED) パラメーターを指定して acknowledge() メソッドを呼び出します。
session.acknowledge(msg, Disposition(RELEASED))
release() メソッドを呼び出します。
リンクの信頼性
これは、信頼できる リンク(通常は at-least-once リンク)上の動作です。これは、ブローカーへの受信側接続のデフォルトリンクです。信頼でき ないリンクを使用して受信側をキューに接続する場合、または交換に直接接続する場合、受信したメッセージは即座に取得され、確認する必要がありません。
デモキューのクリーンアップ
このデモに使用したキューを削除するには、ブローカーを再起動するか(ブローカーの再起動時に非durable キューがすべて削除される)か、qpid-config以下を使用できます。
qpid-config del queue browse-acquire-demo
5.2.2. 信頼性のないリンクのメッセージ取得および許可 リンクのコピーリンクがクリップボードにコピーされました!
link: {reliability: unreliable} にを指定します。たとえば、「browse-acquire-demo」という名前のキューへの信頼できないリンクを持つレシーバーを作成するには、次のコマンドを実行します。
- python
rxacquire = session.receiver("browse-acquire-demo; {link:{reliability: unreliable}")
- python
import sys from qpid.messaging import * def msgfetch(rx): try: msg = rx.fetch(timeout=1) except MessagingError, m: msg = m return msg linktype="" while linktype != "R" and linktype !="U": response = raw_input("Use (R)eliable or (U)nreliable link [R/U]?") linktype = response.upper() connection = Connection("localhost:5672") connection.open() try: session = connection.session() tx = session.sender("browse-acquire-demo;{create: always}") rxbrowse1 = session.receiver("browse-acquire-demo;{mode:browse}") rxbrowse2 = session.receiver("browse-acquire-demo;{mode:browse}") rxbrowse3 = session.receiver("browse-acquire-demo;{mode:browse}") if linktype == "R": rxacquire = session.receiver("browse-acquire-demo") else: rxacquire = session.receiver("browse-acquire-demo; {link:{reliability:unreliable}}") tx.send("Hello World") print "\nBrowser 1 saw message:" print msgfetch(rxbrowse1) print "Browser 1 then saw message:" print msgfetch(rxbrowse1) print "\nBrowser 2 saw message:" print msgfetch(rxbrowse2) print "Browser 2 then saw message:" print msgfetch(rxbrowse2) print "\nAcquired message:" print msgfetch(rxacquire) rxacquire.close() print "\nBrowser 3 saw message:" print msgfetch(rxbrowse3) except MessagingError, m: print m finally: connection.close() connection.open() try: session=connection.session() rxacquire2 = session.receiver("browse-acquire-demo") print "\nAcquirer 2 saw message:" print msgfetch(rxacquire2) except MessagingError, m: print m finally: session.acknowledge() connection.close()
Acquirer 2 saw message:
Message(redelivered=True, properties={'x-amqp-0-10.routing-key': u'browse-acquire-demo'}, content='Hello World')
Acquirer 2 saw message:
None
unreliable。
信頼性のないリンクでのメッセージの解放および拒否
信頼できないリンクで取得したメッセージをリリースまたは拒否することはできません。信頼性のないリンクメッセージは、フェッチ時に暗示的に承認されます。
5.2.3. メッセージ拒否 リンクのコピーリンクがクリップボードにコピーされました!
alternate exchange、拒否されたメッセージがそこにルーティングされ、それ以外の場合は破棄されます。
acknowledge() メソッドを呼び出して、拒否するメッセージを渡し、Disposition パラメーター REJECTED として指定します。
- python
msg = rx.fetch(timeout = 1) if msg.content == "something we don't like": ssn.acknowledge(msg, Disposition(REJECTED)) else: ssn.acknowledge(msg)
unreliable リンクを使用する場合、mesage はフェッチ時に暗黙的に承認されます。
5.2.4. 複数のソースからのメッセージの受信 リンクのコピーリンクがクリップボードにコピーされました!
Receiver オブジェクトは単一のサブスクリプションからメッセージを受信します。アプリケーションは多くのレシーバーを作成でき、これらの受信者からのメッセージを受信順に処理したい場合があります。session オブジェクトは、アプリケーション nextReceiver が複数のレシーバーからメッセージをフェデレーション順に読み込む方法を提供します。
prefetch 側機能を使用するには、受信側に対して有効にし、受信側が同じセッションを使用している必要があります。
- python
receiver1 = session.receiver(address1) receiver1.capacity = 10 receiver2 = session.receiver(address) receiver2.capacity = 10 message = session.next_receiver().fetch() print message.content session.acknowledge()- C++
Receiver receiver1 = session.createReceiver(address1); receiver1.setCapacity(10); Receiver receiver2 = session.createReceiver(address2); receiver2.setCapacity(10); Message message = session.nextReceiver().fetch(); std::cout << message.getContent() << std::endl; session.acknowledge(); // acknowledge message receipt- .NET/C#
Receiver receiver1 = session.CreateReceiver(address1); receiver1.SetCapacity(10); Receiver receiver2 = session.CreateReceiver(address2); receiver2.SetCapacity(10); Message message = new Message(); message = session.NextReceiver().Fetch(); Console.WriteLine("{0}", message.GetContent()); session.Acknowledge();
5.2.5. 拒否されたメッセージと順序付けされたメッセージ リンクのコピーリンクがクリップボードにコピーされました!
5.2.6. 代替の交換 リンクのコピーリンクがクリップボードにコピーされました!
- メッセージコンシューマーによって取得されて拒否されるメッセージ(拒否メッセージ)。
- 削除されるキューの未承認メッセージ(孤立したメッセージ)。
- 交換にマッチするバインディングがないルーティングキーを使用して、交換に送信されたメッセージ。
第6章 高度なキューの機能 リンクのコピーリンクがクリップボードにコピーされました!
6.1. 参照専用キュー リンクのコピーリンクがクリップボードにコピーされました!
spout および drain プログラムはクライアントライブラリーパッケージの一部であり、インストールされている場合は、次の場所にあります。
/usr/share/doc/python-qpid-${version}/examples/api/
./spout \
-c 10 \
--broker "localhost:${PORT}" \
'q; {create: always, node:{type:queue , x-declare:{arguments:{"qpid.browse-only":1}}}}' \
"All work and no play makes Mick a dull boy."
./drain --broker 'localhost:${PORT}' 'q'
関連項目
6.2. ローカルに公開されるメッセージの無視 リンクのコピーリンクがクリップボードにコピーされました!
no-local のキーを key:value ペアとして使用します。キーの値は無視されます。キーが存在するだけで十分です。
qpid-config add queue noloopbackqueue1 --argument no-local=true
6.3. 排他的キュー リンクのコピーリンクがクリップボードにコピーされました!
6.4. サーバー側のセレクター リンクのコピーリンクがクリップボードにコピーされました!
6.4.1. フィルターを使用したメッセージの選択 リンクのコピーリンクがクリップボードにコピーされました!
selector のリンク部分にを指定します。
green red、またはをプロパティーの値 blue としてサーバーを選択して配信し color ます。
queue_name;{link:{selector:"color in ('green', 'red', 'blue')"}}
queue_name;{link:{selector:"amqp.priority = 1"}}
queue_name;{link:{selector:"amqp.priority IS BETWEEN 3 AND 6"}}
queue_name;{link:{selector:"myflag AND amqp.redelivered"}}
queue_name;{link:{selector:"msg_title LIKE '%news%'"}
Python および一時構文
Python では、セレクターは一時構文で使用できます。たとえば、selector の C++ アドレスは以下のようになります。
queue_name;{link:{selector:"myproperty = 1"}}
queue_name;{link:{'x-subscribe': {'arguments': {'x-apache-selector': "myproperty = 1"}}}}
Java およびサーバー側のセレクター
Qpid Java クライアントは現在サーバー側のセレクターをサポートしておらず、JMS セレクターのみをサポートします。JMS セレクターはサーバー側のセレクターとは異なります。JMS slector の詳細については、JMS 仕様を参照してください。
6.4.2. サーバー側のセレクター構文 リンクのコピーリンクがクリップボードにコピーされました!
SelectExpression ::= OrExpression? // Note 0
// Lexical Elements
Alpha ::= [a-zA-Z]
Digit ::= [0-9]
IdentifierInitial ::= Alpha | "_" | "$"
IdentifierPart ::= IdentifierInitial | Digit | "."
Identifier ::= IdentifierInitial IdentifierPart*
Constraint : Identifier NOT IN ("NULL", "TRUE", "FALSE", "NOT", "AND", "OR", "BETWEEN", "LIKE", "IN", "IS", "ESCAPE") // Note 1
LiteralString ::= ("'" [^']* "'")+ // Note 2
LiteralExactNumeric ::= Digit+
Exponent ::= ("+"|"-")? LiteralExactNumeric
LiteralApproxNumeric ::= Digit "." Digit* ( "E" Exponent )? |
"." Digit+ ( "E" Exponent )? |
Digit+ "E" Exponent // Note 1
LiteralBool ::= "TRUE" | "FALSE" // Note 1
Literal ::= LiteralBool | LiteralString | LiteralApproxNumeric | LiteralExactNumeric
EqOps ::= "=" | "<>"
ComparisonOps ::= EqOps | ">" | ">=" | "<" | "<="
AddOps ::= "+" | "-"
MultiplyOps ::= "*" | "/"
// Expression syntax
OrExpression ::= AndExpression ( "OR" AndExpression )*
AndExpression ::= ComparisonExpression ( "AND" ComparisonExpression )*
ComparisonExpression ::= AddExpression "IS" "NOT"? "NULL" |
AddExpression "NOT"? "LIKE" LiteralString ( "ESCAPE" LiteralString )? |
AddExpression "NOT"? "BETWEEN" AddExpression "AND" AddExpression |
AddExpression "NOT"? "IN" "(" PrimaryExpression ("," PrimaryExpression)* ")" |
AddExpression ComparisonOps AddExpression |
"NOT" ComparisonExpression |
AddExpression // Note 3
AddExpression ::= MultiplyExpression ( AddOps MultiplyExpression )*
MultiplyExpression ::= UnaryArithExpression ( MultiplyOps UnaryArithExpression )*
UnaryArithExpression ::= AddOps AddExpression |
"(" OrExpression ")" |
PrimaryExpression
PrimaryExpression ::= Identifier |
Literal
E」など、予約されて falseいるすべての単語は大文字 true と小文字を区別しません。
'' ができます '。
( "ESCAPE" LiteralString ) 節で LiteralString は、1 つの文字列に限定されます。文字 % および _ は使用できません。
6.5. 自動的に削除されたキュー リンクのコピーリンクがクリップボードにコピーされました!
6.5.1. 自動的に削除されたキュー リンクのコピーリンクがクリップボードにコピーされました!
auto-delete 削除されます。auto-delete キューの作成後、コンシューマーがキューにサブスクライブするとすぐに削除の対象になります。キューにサブスクライブするコンシューマーの数がゼロになると、キューが削除されます。
- python
responsequeue = session.receiver('my-response-queue; {create:always, node:{x-declare:{auto-delete:True}}}')
default 交換)にバインドされます。
カスタムタイムアウト
削除が発生する前に猶予期間を提供するようにカスタムタイムアウトを設定できます。
qpid.auto_delete_timeout:0 されている場合には効果がありません。パラメーターを 0 に設定すると遅延自動削除機能が無効になります。
- python
responsequeue = session.receiver("my-response-queue; {create:always, node:{x-declare:{auto-delete:True, arguments:{'qpid.auto_delete_timeout':120}}}}")
- python
testqueue = session.sender("my-test-queue; {create:always, node:{x-declare:{auto-delete:True}}}") testqueuehandle = session.receiver("my-test-queue") ..... connection.close() # testqueuehandle is now released
exclusive と、auto-deleteこれらのキューはブローカーによって削除されます。
6.5.2. 自動的に削除されたキューの例 リンクのコピーリンクがクリップボードにコピーされました!
auto-delete-producer.pyます。Python インタープリターを使用して実行できます。
- python
import sys from qpid.messaging import * connection=Connection("localhost:5672") connection.open() try: session=connection.session() tx=session.sender("test-queue; {create:always, node:{x-declare:{auto-delete:True}}}") tx.send("test message!") x = raw_input("Press Enter to continue") tx.send("test message 2") except MessagingError, m: print m connection.close()
durable キューが削除されます。これにより、クリーンな状態でこのテストを開始できます。
qpid-config queues
exclusive あり auto-delます。これは、キューのリストの取得に使用して qpid-config いるキューで、コマンドを実行するたびに変更されます。
auto-delete-producer.py プログラムを起動します。
python auto-delete-producer.py
test-queue ことがわかります。プログラムは終了しましたが、キューは削除されていません。そのため、このプログラムはサブスクライブしていないためです。
amqp1.0 動作には違いがあることに注意してください。キュー amqp0-10 の使用は、コンシューマーがある場合にのみ使用されない場合に削除されます。amqp1.0 キューの使用は、コンシューマーがない場合でも使用されていないと削除されます。
drain -c 0 test-queue
drain -c 0 "test-queue;{mode:browse}"
auto-delete-subscribe.pyます。
- python
import sys from qpid.messaging import * connection=Connection("localhost:5672") connection.open() try: session=connection.session() rx=session.receiver("test-queue") print rx.fetch(timeout = 1) session.acknowledge() except MessagingError,m: print m connection.close()
auto-delete-producer.pyます。一時停止したら、を実行 auto-delete-subscriber.pyします qpid-config queues。キューが削除されたことを確認します。
auto-delete-producer.py た際に作成された test-queue は削除され、接続を閉じるとサブスクライブ解除されます。メッセージプロデューサーから送信された 2 番目のメッセージは配信され ず、例外が発生しなくなりました。
- python
import sys from qpid.messaging import * connection=Connection("localhost:5672") connection.open() try: session=connection.session() tx=session.sender("test-queue; {create:always, node:{x-declare:{auto-delete:True}}}") rx=session.receiver("test-queue") tx.send("test message!") x = raw_input("Press Enter to continue") tx.send("test message 2") x = raw_input("Press Enter to continue") except MessagingError, m: print m connection.close()
auto-delete-producer.py プログラムを起動します。最初の一時停止 auto-delete-subscriber.py で実行します。以前は、これによりキューが削除され、2 番目のメッセージは何も表示されませんでした。この時点で、プロデューサーのサブスクリプションはキューを存続させ続けます。Enter を押して 2 番目のメッセージを auto-delete-producer.py 送信します。次に、drain またはのいずれかを使用してキューを確認し auto-delete-subscriber.pyます。この場合、キューが存在し、メッセージが予想通りに配信されていることを確認できます。
6.5.3. キューの削除チェック リンクのコピーリンクがクリップボードにコピーされました!
- ACL が有効になっている場合、ブローカーは削除を開始したユーザーがこれを実行するパーミッションがあることを確認します。
ifEmptyフラグが渡されると、キューが空でない場合は、ブローカーによって例外が発生します。ifUnusedフラグが渡されると、キューにサブスクライバーがある場合にブローカーによって例外が発生します。- キューが排他的である場合、ブローカーは削除を開始したユーザーがキューを所有することを確認します。
6.6. Last Value(LV)キュー リンクのコピーリンクがクリップボードにコピーされました!
6.6.1. 最後の値キュー リンクのコピーリンクがクリップボードにコピーされました!
6.6.2. 最終値キューの宣言 リンクのコピーリンクがクリップボードにコピーされました!
qpid.last_value_queue_key 時に指定されることで作成されます。
stock-symbol として stock-ticker 使用する最後の値キューを作成するには、次のコマンドを qpid-config実行します。
qpid-config add queue stock-ticker --argument qpid.last_value_queue_key=stock-symbol
- python
myLastValueQueue = mySession.sender("stock-ticker;{create:always, node:{type:queue, x-declare:{arguments:{'qpid.last_value_queue_key': 'stock-symbol'}}}}")
RHT」、"、および他の文字列値、および他の整数値JAVA、および他の整数値など 3 15、Sockt -symbol キーの有効な値が含まれます。
6.6.3. 最後の値キューの例 リンクのコピーリンクがクリップボードにコピーされました!
- python
import sys from qpid.messaging import *
- python
connection = Connection("localhost:5672") connection.open()
- python
session = connection.session()
- python
stockSender = session.sender("stock-ticker;{create:always, node:{type:queue, x-declare:{arguments:{'qpid.last_value_queue_key': 'stock-symbol'}}}}")
qpid-config add queue stock-ticker --argument qpid.last_value_queue_key=stock-symbol
- python
msg1 = Message("10") msg1.properties = {'stock-symbol':'RHT'} msg2 = Message("10") msg2.properties = {'stock-symbol':'JAVA'} msg3 = Message("10") msg3.properties = {'stock-symbol':'MSFT'} msg4 = Message("12") msg4.properties = {'stock-symbol':'RHT'}
msg4 更新し msg1ます。標準の FIFO キューと最後の値キューの動作を比較するには、メッセージを control -queue と呼ばれる制御 キューに同時に送信します。
- python
controlSender = session.sender("control-queue;{create:always, node:{type:queue}}")
- python
stockSender.send(msg1) controlSender.send(msg1) stockSender.send(msg2) controlSender.send(msg2) stockSender.send(msg3) controlSender.send(msg3) stockSender.send(msg4) controlSender.send(msg4)
- python
stockBrowser = session.receiver("stock-ticker; {mode:browse}") controlBrowser = session.receiver("control-queue; {mode:browse}")
session.receiver("stock-ticker")し、demo を再度実行します。レシーバーを閲覧すると、キューをクリアせずに数回実行することで、最終値のキューの影響をより明確に確認できます。
available() メソッドを使用してキューにあるメッセージ数をカウントできるようにします。これは、レシーバーのプリフェッチ capacity をデフォルトの 0 よりも高い値に設定します。
- python
stockBrowser.capacity = 20 controlBrowser.capacity = 20
- python
sleep 10
- python
from time import sleep
available() プロパティーを調べるために、これはキュー内のメッセージ数を表すことが確実に指定されていることに注意してください。非同期的に操作すると、ローカルで利用可能なメッセージの数が available() 報告されます。10 秒の遅延後には、キュー内のメッセージの合計数であることが合理的に考えられます。実際の非同期操作では、アプリケーションの実行をブロックしません。代わりに、以下のようなパターンを使用します。
- python
while True: try: msg = stockBrowser.fetch(timeout = 10) print msg.properties["stock-symbol"] + ":" + msg.content except Empty: break
- python
print "Last Value Queue has " + str(stockBrowser.available()) + " messages" print "\nLast Value Queue messages:" for x in range(stockBrowser.available()): try: msg = stockBrowser.fetch(timeout = 1) print msg.properties["stock-symbol"] + ":" + msg.content except MessagingError, m: pass print "Control Queue has " + str(controlBrowser.available()) + " messages" print "\nControl Queue messages:" for x in range(controlBrowser.available()): try: msg = controlBrowser.fetch(timeout = 1) print msg.properties["stock-symbol"] + ":" + msg.content except MessagingError, m: pass
- python
session.acknowledge() connection.close()
- python
import sys from qpid.messaging import * from time import sleep connection = Connection("localhost:5672") try: connection.open() session = connection.session() stockSender = session.sender("stock-ticker;{create:always, node:{type:queue, x-declare:{arguments:{'qpid.last_value_queue_key': 'stock-symbol'}}}}") controlSender = session.sender("control-queue;{create:always, node:{type:queue}}") stockBrowser = session.receiver("stock-ticker;{mode:browse}") controlBrowser = session.receiver("control-queue;{mode:browse}") controlBrowser = session.receiver("control-queue") msg1 = Message("10") msg1.properties = {'stock-symbol':'RHT'} msg2 = Message("10") msg2.properties = {'stock-symbol':'JAVA'} msg3 = Message("10") msg3.properties = {'stock-symbol':'MSFT'} msg4 = Message("12") msg4.properties = {'stock-symbol':'RHT'} stockSender.send(msg1) controlSender.send(msg1) stockSender.send(msg2) controlSender.send(msg2) stockSender.send(msg3) controlSender.send(msg3) stockSender.send(msg4) controlSender.send(msg4) stockBrowser.capacity = 20 controlBrowser.capacity = 20 sleep(10) print "\nLast Value Queue has " + str(stockBrowser.available()) + " messages" print "Last Value Queue messages:" for x in range(stockBrowser.available()): try: msg = stockBrowser.fetch(timeout = 1) print msg.properties["stock-symbol"] + ":" + msg.content except MessagingError, m: pass print "\nControl Queue has " + str(controlBrowser.available()) + " messages" print "Control Queue messages:" for x in range(controlBrowser.available()): try: msg = controlBrowser.fetch(timeout = 1) print msg.properties["stock-symbol"] + ":" + msg.content except MessagingError, m: pass session.acknowledge() except MessagingError,m: print m finally: connection.close()
6.6.4. 最後の値キューのコマンドラインの例 リンクのコピーリンクがクリップボードにコピーされました!
qpid-config add queue my-queue --argument qpid.last_value_queue_key=type
type' は、キュー内のメッセージを照合するために使用されます。
./drain -f -c 0 'my-queue; {mode: browse}'
type' のヘッダー値を設定します。
./spout -P type=a my-queue a1
./spout -P type=a my-queue a2
./spout -P type=a my-queue a3
./spout -P type=b my-queue b1
./spout -P type=c my-queue c1
./spout -P type=c my-queue c2
./spout -P type=a my-queue a4
./drain -c 0 'my-queue; {mode: browse}'
type' 値に対する最後のメッセージのみが表示されます。
6.7. 優先順位キュー リンクのコピーリンクがクリップボードにコピーされました!
6.7.1. 優先順位キュー リンクのコピーリンクがクリップボードにコピーされました!
qpid.priority 属性で宣言されます。この属性は 1 から 10 の整数値で、キューの固有の優先度レベルの数を定義します。
qpid.priority 属性が 10 に設定されている場合、キューには 10 個の異なる優先度レベルがあります。この場合、優先度が 10 のメッセージは、優先度が 5 のメッセージの前に配信されます。これは、優先度が 1 のメッセージの前に送信されます。
qpid.priority 属性が 2 に設定されている場合、キューに異なる優先度レベルが 2 つあります。この場合、メッセージの優先度 6-10 はキューの優先度レベル 1 で、メッセージの優先度 1-5 はキューの優先度 2 です。同じ優先度の帯域幅のメッセージは、その優先度と受信順序に基づいて配信されます。
6.7.2. 優先度キューの宣言 リンクのコピーリンクがクリップボードにコピーされました!
qpid.priorities の x-declare 引数に値を指定します。例:
- python
sender = session.sender('my-queue; {create: always, node:{x-declare:{arguments:{qpid.priorities:10}}}}')
qpid-config add queue 'my-queue; {create: always, node:{x-declare:{arguments:{qpid.priorities:10}}}}'
6.7.3. Priority Queues を使用する際の考慮事項 リンクのコピーリンクがクリップボードにコピーされました!
コンシューマーおよび優先度キューの閲覧
優先順位キューは、キューの通常の First-In-First-Out(FIFO)の順序ではなく、優先度順にメッセージを収集します。コンシューマーを参照 するための配信順序は「未定義」です。書き込み時には、コンシューマーの閲覧は FIFO 順に優先度キューからメッセージを受信しますが、今後変更される可能性があるため、アプリケーションでこの動作に依存しないでください。
Certshare 機能
メッセージエンキュー速度が優先度キューのデキューレートを十分に超過する場合、優先度の低いメッセージがキューから削除されない可能性があります。この状況を回避するために 、 コンシューマーは各優先度レベルから指定されたメッセージのブロックを順番に取得することができます。
6.7.4. 優先順位キューのデモンストレーション リンクのコピーリンクがクリップボードにコピーされました!
- python
#!/usr/bin/python import sys from qpid.messaging import * connection = Connection("localhost:5672") connection.open() try: ssn = connection.session() x = 0 print "\n" while True: print "Create queue with 2 or 10 priority levels?" x = raw_input() if (x == "2") or (x == "10"): break tx = ssn.sender("nonpriority-demo-queue; {create: always, node: {type: 'queue'}}") print "Creating a priority queue with " + x + " priority levels:" address = "priority-demo-queue; {create: always, " address = address + "node:{x-declare: {auto-delete:True, " address = address + "arguments: {'qpid.priorities': " address = address + x + "}}}}" print address txpriority = ssn.sender(address) rx = ssn.receiver('nonpriority-demo-queue') rxpriority = ssn.receiver("priority-demo-queue") rxbrowse = ssn.receiver("priority-demo-queue; {mode: browse}") print "\nPress Enter to continue\n" x = raw_input() print "First message sent:" msg = Message("priority 1") msg.priority = 1 tx.send(msg) txpriority.send(msg) print msg print "Second message sent:" msg = Message('priority 4') msg.priority = 4 tx.send(msg) txpriority.send(msg) print msg print "\nPress Enter to continue\n" x = raw_input() print "BROWSE PRIORITY QUEUE" print "First browse in priority queue:" print rxbrowse.fetch() print "Second browse in priority queue:" print rxbrowse.fetch() print "\nPress Enter to continue\n" x = raw_input() print "ACQUIRE PRIORITY QUEUE" print "First message in priority queue:" print rxpriority.fetch() print "Second message in priority queue:" print rxpriority.fetch() print "\nPress Enter to continue\n" x = raw_input() print "ACQUIRE NON-PRIORITY QUEUE" print "First message in non-priority queue:" print rx.fetch() print "Second message in non-priority queue:" print rx.fetch() ssn.acknowledge() finally: connection.close()
Create queue with 2 or 10 priority levels?
10
Creating a priority queue with 10 priority levels:
priority-demo-queue; {create: always, node:{x-declare: {auto-delete:True, arguments: {'qpid.priorities': 10}}}}
auto-delete: True できるように宣言され qpid.prioritiesます。送信側の作成時にキューがすでに存在する場合は、に指定された値 qpid.priorities は影響しません。この値は、キューの作成時にのみ有効です。
First message sent:
Message(priority=1, content='priority 1')
Second message sent:
Message(priority=4, content='priority 4')
BROWSE PRIORITY QUEUE
First browse in priority queue:
Message(priority=1, properties={'x-amqp-0-10.routing-key': u'priority-demo-queue'}, content='priority 1')
Second browse in priority queue:
Message(priority=4, properties={'x-amqp-0-10.routing-key': u'priority-demo-queue'}, content='priority 4')
ACQUIRE PRIORITY QUEUE
First message in priority queue:
Message(priority=4, properties={'x-amqp-0-10.routing-key': u'priority-demo-queue'}, content='priority 4')
Second message in priority queue:
Message(priority=1, properties={'x-amqp-0-10.routing-key': u'priority-demo-queue'}, content='priority 1')
ACQUIRE NON-PRIORITY QUEUE
First message in non-priority queue:
Message(priority=1, properties={'x-amqp-0-10.routing-key': u'nonpriority-demo-queue'}, content='priority 1')
Second message in non-priority queue:
Message(priority=4, properties={'x-amqp-0-10.routing-key': u'nonpriority-demo-queue'}, content='priority 4')
Create queue with 2 or 10 priority levels?
2
Creating a priority queue with 2 priority levels:
priority-demo-queue; {create: always, node:{x-declare: {auto-delete:True, arguments: {'qpid.priorities': 2}}}}
....
ACQUIRE PRIORITY QUEUE
First message in priority queue:
Message(priority=1, properties={'x-amqp-0-10.routing-key': u'priority-demo-queue'}, content='priority 1')
Second message in priority queue:
Message(priority=4, properties={'x-amqp-0-10.routing-key': u'priority-demo-queue'}, content='priority 4')
6.8. メッセージグループ リンクのコピーリンクがクリップボードにコピーされました!
6.8.1. メッセージグループ リンクのコピーリンクがクリップボードにコピーされました!
6.8.2. メッセージグループを有効にしてキューを作成する リンクのコピーリンクがクリップボードにコピーされました!
qpid.shared_msg_group の値 qpid.group_header_key および値を指定します。
qpid.group_header_key は、メッセージと照合するために使用されるヘッダーキーです。ヘッダーのこのキーに同じ値を持つメッセージは同じグループに属します。
qpid.shared_msg_group をに設定する必要があり 1ます。
- python
groupedSender = session.sender("my-grouped-msg-queue; {create: always, node: {x-declare: {auto-delete: True, arguments: {'qpid.group_header_key': 'msgGroupID', 'qpid.shared_msg_group': 1}}}}")- C++
Sender groupedSender = session.createSender("my-grouped-msg-queue; {create:always, node: {x-declare: {auto-delete: True, arguments: {'qpid.group_header_key':'msgGroupID', 'qpid.shared_msg_group':1}}}}")
6.8.3. メッセージグループのコンシューマー要件 リンクのコピーリンクがクリップボードにコピーされました!
redelivered=True、残りのグループは欠落しています。
6.8.4. qpid-config を使用したメッセージグループのキューの設定 リンクのコピーリンクがクリップボードにコピーされました!
qpid-config add queue MyMsgQueue --group-header="GROUP_KEY" --shared-groups
6.8.5. デフォルトグループ リンクのコピーリンクがクリップボードにコピーされました!
qpid.no-group。他のグループにメッセージを割り当てることができない場合は、このグループに割り当てられます。
6.8.6. デフォルトのグループ名の上書き リンクのコピーリンクがクリップボードにコピーされました!
qpid.no-groupます。このデフォルトのグループ名を変更するには、起動時に default-message-group configuration パラメーターの値を broker に指定します。たとえば、コマンドラインを使用します。
qpidd --default-message-group "EMPTY-GROUP"
6.8.7. メッセージグループデモンストレーション リンクのコピーリンクがクリップボードにコピーされました!
message-groups.py、そのまま保存してから、メッセージングブローカーが起動したマシンで Python を使用します。
- python
import sys from qpid.messaging import * def sendmsg(group, num): # send the message to the broker and add it to our in-memory representation of the broker queue global memoryqueue global tx msg = Message(group + num) msg.properties = {'ourGroupID': group} tx.send(msg) memoryqueue.append(group + num) def pullmsg(consumer): # fetch a message from the broker and print it to the console global counter global memoryqueue msg = consumers[consumer - 1].fetch(timeout = 1) print "\nQueued message: " + memoryqueue[counter] print "Consumer " + str(consumer) + " got: " + msg.content counter +=1 return msg # Two connections are used to simulate two distinct consumers connection = Connection("localhost:5672") connection2 = Connection("localhost:5672") connection.open() connection2.open() try: session = connection.session() session2 = connection2.session() x = raw_input('Enable message grouping [Y/n]?') if x == 'N' or x == 'n': # Create the queue without message groups tx = session.sender("test-nogroup-queue; {create: always, node:{x-declare:{auto-delete:True}}}") rx1 = session.receiver("test-nogroup-queue") rx2 = session2.receiver("test-nogroup-queue") print "\nMessage grouping is disabled" msggroup = False else: # Create the queue with message groups enabled tx = session.sender("test-group-queue; {create: always, node:{x-declare:{auto-delete: True, arguments: {'qpid.group_header_key': 'ourGroupID', 'qpid.shared_msg_group' : 1}}}}") rx1 = session.receiver("test-group-queue") rx2 = session2.receiver("test-group-queue") print "\nMessage grouping is enabled" msggroup = True # Put the receivers in an array so we can use a function to fetch messages consumers = [] consumers.append(rx1) consumers.append(rx2) print "Sending interleaved messages from two different groups to the queue..." # We create an in-memory picture of the queue, to see what order the messages are on the broker memoryqueue = [] sendmsg('A', '1') sendmsg('B', '1') sendmsg('B', '2') sendmsg('A', '2') sendmsg('B', '3') sendmsg('A', '3') counter = 0 pullmsg(1) pullmsg(2) if msggroup: print "\nConsumer 1 now owns message group A. Consumer 2 now owns message group B." msgc1 = pullmsg(1) msgc2 = pullmsg(2) if msggroup: print "\nThe consumers will now acknowledge all the messages, or only the last one." resp = raw_input('Should they acknowlege all messages? [Y/n]') if resp == 'N' or resp == 'n': print "\nAcknowledging only part of the group. The consumers retain ownership of the group. This is an anti-pattern! See the source code comments for details." session.acknowledge(msgc1) session2.acknowledge(msgc2) antipattern = True # Acknowledging only part of a group is an anti-pattern. Messages are grouped to ensure that a single consumer can deal with the whole group. If this consumer now fails before completing the rest of the group, the unacknowledged messages in the group will be released and redelivered by the broker, but the acknowledged messages in the group are now missing in action! else: print "\nAcknowledging all fetched messages. The consumers will release ownership of the groups." session.acknowledge() session2.acknowledge() antipattern = False print "\nPulling more messages from the queue:" pullmsg(1) pullmsg(2) if msggroup: if antipattern == False: print "\nConsumer 1 now owns message group B. Consumer 2 now owns message group A." print "\nSending some more messages to the queue..." sendmsg('B', '4') sendmsg('B', '5') sendmsg('A', '4') sendmsg('A', '5') pullmsg(1) pullmsg(2) pullmsg(1) pullmsg(2) finally: connection.close() connection2.close()
プログラムの出力例
プログラムは、2 つの異なるグループ A と B - からキューにメッセージを送信します。メッセージグループが無効になっている場合の出力の例を以下に示します。
$ python message-groups.py
Enable message grouping [Y/n]?n
Message grouping is disabled
Sending interleaved messages from two different groups to the queue...
Queued message: A1
Consumer 1 got: A1
Queued message: B1
Consumer 2 got: B1
Queued message: B2
Consumer 1 got: B2
Queued message: A2
Consumer 2 got: A2
Queued message: B3
Consumer 1 got: B3
Queued message: A3
Consumer 2 got: A3
Queued message: B4
Consumer 1 got: B4
Queued message: B5
Consumer 2 got: B5
Queued message: A4
Consumer 1 got: A4
Queued message: A5
Consumer 2 got: A5
$ python message-groups.py
Enable message grouping [Y/n]?y
Message grouping is enabled
Sending interleaved messages from two different groups to the queue...
Queued message: A1
Consumer 1 got: A1
Queued message: B1
Consumer 2 got: B1
Consumer 1 now owns message group A. Consumer 2 now owns message group B.
Queued message: B2
Consumer 1 got: A2
Queued message: A2
Consumer 2 got: B2
The consumers will now acknowledge all the messages, or only the last one.
Should they acknowlege all messages? [Y/n]y
Acknowledging all fetched messages. The consumers will release ownership of the groups.
Pulling more messages from the queue:
Queued message: B3
Consumer 1 got: B3
Queued message: A3
Consumer 2 got: A3
Consumer 1 now owns message group B. Consumer 2 now owns message group A.
Sending some more messages to the queue...
Queued message: B4
Consumer 1 got: B4
Queued message: B5
Consumer 2 got: A4
Queued message: A4
Consumer 1 got: B5
Queued message: A5
Consumer 2 got: A5
The consumers will now acknowledge all the messages, or only the last one.
Should they acknowlege all messages? [Y/n]n
Acknowledging only part of the group. The consumers retain ownership of the group. This is an anti-pattern! See the source code comments for details.
Pulling more messages from the queue:
Queued message: B3
Consumer 1 got: A3
Queued message: A3
Consumer 2 got: B3
Sending some more messages to the queue...
Queued message: B4
Consumer 1 got: A4
Queued message: B5
Consumer 2 got: B4
Queued message: A4
Consumer 1 got: A5
Queued message: A5
Consumer 2 got: B5
第7章 非同期メッセージング リンクのコピーリンクがクリップボードにコピーされました!
7.1. 非同期操作 リンクのコピーリンクがクリップボードにコピーされました!
7.2. 非同期送信 リンクのコピーリンクがクリップボードにコピーされました!
7.2.1. 同期および非同期送信 リンクのコピーリンクがクリップボードにコピーされました!
send オブジェクト send() メソッドへの呼び出しは非同期です。ブローカーから受信を待つことなく、即座に返します。
- python
sender.send(message, sync = False)- C++
sender.send(message, false)これは、C++ API のデフォルト動作であることに注意してください。
7.2.2. Sender Capacity リンクのコピーリンクがクリップボードにコピーされました!
capacity は、送信者が許可するサーバーから非同期送信待ちの確認応答数を制御する送信元オブジェクトのプロパティーです。これらの未承認のメッセージは、リンクが失敗した場合の再送信のためにメモリーでバッファーされるため、送信側のリプレイバッファーサイズとも呼ばれ ます。
UNLIMITEDつまり、送信側は無制限の非同期呼び出しを許可し、システムのメモリー制限によってのみ制限されるメッセージをバッファーします。
capacity 設定されていると、送信者は多数の非同期送信操作を同時に処理できないことのみが許可されます。
capacity されている場合、最大 10 個の非同期送信操作が、送信側に対して同時に確認応答を待機できます。10 番目の非同期送信操作が呼び出され、その 10 つ目の操作がブローカーによって承認される前に 11 つ目の操作が試行される場合、送信者はブローカーによって非同期送信操作のいずれかが承認されるまでブロックされます。
7.2.3. 送信元容量の設定 リンクのコピーリンクがクリップボードにコピーされました!
capacity プロパティーに値を割り当てます。C++ では、送信側の容量は setCapacity メソッドを使用して設定されます。
- python
sender.capacity = 20- C++
sender.setCapacity(20)
7.2.4. クエリー送信容量 リンクのコピーリンクがクリップボードにコピーされました!
- Sender Capacity
- 保留中の確認応答に常時指定できる非同期に送信されるメッセージの最大数。デフォルトではこれはですが
UNLIMITED、未設定の非同期呼び出しの数を制限するように変更できます。送信側が容量にあるときにさらに非同期呼び出しを試みると、送信された別のメッセージがブローカーによって承認されるまでブロックされます。- C++
sender.getCapacity()- python
sender.capacity
- 送信元の未設定
- ブローカーから保留中の確認応答を送信する非同期の数。
- C++
sender.getUnsettled()- python
sender.unsettled()
- 送信元が利用可能
- 現在送信側が許可できる追加の非同期呼び出しの数。この値はプロパティーとして利用できますが、
sender.capacity- から計算することもできsender.unsettledます。- C++
sender.getAvailable()- python
sender.available()
7.2.5. ブロックされた非同期送信の回避 リンクのコピーリンクがクリップボードにコピーされました!
- C++
if (sender.getAvailable() > 0) sender.send(message, false) // else drop the message- python
if sender.available() > 0: sender.send(message, sync=False) else: # drop the message
- C++
sender.setCapacity(SOME_LARGE_NUMBER)- python
sender.capacity = SOME_LARGE_NUMBER
7.2.6. 非同期メッセージ送信の例 リンクのコピーリンクがクリップボードにコピーされました!
- C++
sender.setCapacity(MY_CAPACITY); // Later bool resend = true; while (resend) { if (sender.getAvailable()>0) { sender.send(message,false); resend = false; } else { // May wish to do nothing here // or send to log file std::cout << "Warning: Capacity \ full. Retry" << std::endl; } } // Later if (sender.getUnsettled()) { session.sync(); }- python
snd.capacity = MY_CAPACITY # Later resend = True while (resend): if (snd.available()>0): snd.send(msg, sync = False) resend = False else: print "Warning: Capacity full" # Later if (snd.unsettled()): ssn.sync()
7.2.7. 非同期の送受信とリンクの信頼性 リンクのコピーリンクがクリップボードにコピーされました!
sender.capacity は、非同期送信時に送信者が許可する未確認応答の数です。2 フェーズの送信/承認の動作は、信頼できるリンクの特性です(技術的には at-least-once の信頼性のあるリンクとして知られています)。送信側はメッセージの確認応答にサーバーが応答するまでメッセージをローカルに送信し、そのメッセージをローカルにバッファーします。この未承認の送信メッセージのバッファーは、リンクが破棄されて再度確立された場合に、送信者がメッセージを再送信(送信元再生)できるようにします。信頼できるリンクが破棄されて透過的に再確立されると、サーバーが承認されていないメッセージが送信されても、送信元再生バッファーから再送信されます。
unreliable リンクを明示的に要求できます。例:
- python
sender = session.sender("amq.topic;{link: {'reliability': 'unreliable'}}")
unreliable リンクを使用する場合、送信側の容量には意味がありません。信頼性のないリンクでは、サーバーはメッセージの受信を認識しません。すべてのメッセージは、送信後確認応答した方が適切とみなされます。これは、送信側 unreliable の意味です。リンクがドロップされた場合、送信者はブローカーにどのメッセージがロードされたかを確認する方法がありません。また、容量が使用されないため、信頼できないリンク非同期送信者はブロックされないことを意味します。
Sender.capacity アプリケーションの公開をデータ損失に制限するために使用されます。また、送信側が再生バッファーで消費可能なメモリー量を制限します。プロデューサーのスロットルにも使用できます。送信元再生バッファーに必要なローカルメモリーの影響なしに、信頼できないリンクと、プロデューサーのスロットリングは発生しない状態で、非同期送信と最大スループットへの非同期送信を使用できます。ただし、信頼性が低下し、データ損失の可能性が重要ではない状況で、このパターンを使用することに注意してください。
- python
import sys from qpid.messaging import * connection = Connection("localhost:5672") try: connection.open() session = connection.session() linktype="" while linktype != "R" and linktype !="U": response = raw_input("Use (R)eliable or (U)nreliable link [R/U]? ") linktype = response.upper() if linktype == "U": sender = session.sender("amq.topic;{link: {'reliability': 'unreliable'}}") else: sender = session.sender("amq.topic") message = Message("Hello World:") print sender.capacity sender.capacity = 5 for x in range (1000): if sender.available() == 0: print "Sender is blocking..." sender.send("Hello World: " + str(x), sync=False) print str(x) +" : " + str(sender.unsettled()) + " : " + str(sender.available()) except MessagingError,m: print m finally: connection.close()
message number : unacknowledged messages : further async send capacity
Use (R)eliable or (U)nreliable link [R/U]? R
...
918 : 1 : 4
919 : 2 : 3
920 : 3 : 2
921 : 4 : 1
922 : 5 : 0
Sender is blocking...
sender.capacity (プログラムコードで 5 に設定)、送信側ブロックへの影響を確認できます。
sender.capacity がないことが分かります。ただし、信頼できないことに注意してください。
Use (R)eliable or (U)nreliable link [R/U]? U
...
984 : 0 : 5
985 : 0 : 5
986 : 0 : 5
987 : 0 : 5
988 : 0 : 5
989 : 0 : 5
7.3. 非同期の受信 リンクのコピーリンクがクリップボードにコピーされました!
7.3.1. 非同期メッセージ取得(Prefetch) リンクのコピーリンクがクリップボードにコピーされました!
fetch() 呼び出しの応答として単一のメッセージを同期的に取得します。メッセージ のプレフェッチを行うレシーバーの容量はデフォルトで 0 です。
capacity プロパティーを設定して有効および制御されます。
- 事前にフェッチされたメッセージは、アプリケーションによって要求された場合にローカルで利用できます。ただし、ブローカーからメッセージを取得する同期呼び出しのオーバーヘッドはありません。
- prefetching が有効になっているレシーバーには、事前フェッチされたメッセージが利用可能数を判断するために呼び出される
available()メソッドがあります。
available() メソッドには、以下の 2 つの点に注意してください。
available() として呼び出しによって返される数字に依存することはできません。たとえば、受信側の available() キャパシティーを 0 以外の値に設定したら、利用できる値が 0 のメッセージを返す可能性があります。これは、キューに必ずしもメッセージがないことを意味しますが、事前にフェッチされたメッセージはまだローカルで利用可能ではないことを意味します。
available メソッドによって報告される最大値は、capacity 受信側になります。この available() メソッドは、キュー内のメッセージの数ではなく、利用可能な事前フェッチされたメッセージの数を報告します。利用可能なメッセージの数がレシーバーの容量よりも小さい場合は、プレフェッチの非同期性質について、上記のメッセージと共にキュー内のメッセージ数であることを推測することができます。
7.3.2. Enable Receiver Prefetch リンクのコピーリンクがクリップボードにコピーされました!
- python
import sys from qpid.messaging import * connection = Connection("localhost:5672") connection.open() ssn = connection.session() prefetchingReceiver = ssn.receiver("testqueue; {create:always}"); prefetchingReceiver.capacity = 100
7.3.3. 受信メッセージについて非同期的に確認する リンクのコピーリンクがクリップボードにコピーされました!
acquired ブローカーに設定されます。メッセージが acquired モードの場合、キューには表示されません。応答を承認せずにコンシューマーが切断される acquired と、ヘッダーを使用してメッセージがコンシューマーから再度利用可能になり redelivered=trueます。
session オブジェクトの acknowledge() メソッドを呼び出してこれを行います。
- python
session.acknowledge()
acknowledge() メソッドを呼び出すと、そのセッションを使用してフェッチされたすべてのメッセージとして承認されます。特定のメッセージを承認するには、メッセージを引数として渡します。例:
- python
msg = rx.fetch(timeout = 1) session.acknowledge(msg)
sync = False パラメーターを指定して非同期的に呼び出すこともできます。
- python
session.acknowledge(msg, sync = False)
信頼性のないリンク上でメッセージを受信したことを承認する
レシーバーに unreliable リンクが要求されると、メッセージの取得時に確認応答が暗黙的になります。つまり、ブローカーは受信側が取得するとすぐにメッセージをマークします。確認を必要としず、メッセージのリリースや拒否はできません。
7.3.4. 非同期受信およびリンクの信頼性 リンクのコピーリンクがクリップボードにコピーされました!
unreliable リンクの組み合わせは、損失の可能性があることに留意してください。unreliable リンク上では、(キューの閲覧ではなく)アプリケーションが消費される場合に、事前にフェッチされると直ちにキューからメッセージが削除されます。コンシューマーからの承認待ちは行われません。事前にフェッチされたメッセージをディスパッチする前にコンシューマーが失敗すると、ブローカーは再配信されません。
unreliable リンクの組み合わせは、影響に注意してください。
第8章 信頼性とサービス品質 リンクのコピーリンクがクリップボードにコピーされました!
8.1. リンクの信頼性 リンクのコピーリンクがクリップボードにコピーされました!
8.1.1. 信頼できるリンク リンクのコピーリンクがクリップボードにコピーされました!
信頼できるリンクでのメッセージの受信
メッセージコンシューマー( 競合メッセージコンシューマーとも呼ばれます)は、キューからメッセージを削除し、他のコンシューマーが使用不可にするメッセージコンシューマーです。メッセージコンシューマーが信頼できるリンクでブローカーからメッセージを取得すると、メッセージはに設定され acquiredます。取得した状態では、メッセージは他のコンシューマーには表示されません。これはコンシューマーが取得したすべての目的と目的を行いますが、ブローカーは、コンシューマーがストリープを 認識 するまでコピーを維持します。この時点で、ブローカーはメッセージを確実に配信し、そのコピーを削除します。
redelivered: trueます。
alternate exchange、ブローカーはこのメッセージをにルーティングします。設定されていない場合 alternate exchange は、メッセージは破棄されます。
信頼できるリンクでのメッセージの送信
信頼できるリンク経由でメッセージがブローカーに送信されると、送信者はブローカーが受信を受け入れるまでローカルコピーを維持します。その時点で、送信者はローカルコピーを削除します。同期的に送信すると、交換が行われるまでアプリケーションがブロックされます。非同期的にこれらの未承認の送信メッセージを送信するときは、送信元再生バッファー に保存されます。
信頼できるリンクの指定
キューへのすべてのリンクは、デフォルトで信頼性があります。キューへの接続時に信頼できるリンクを明示的に要求する必要はありません。
link: {'reliability': 'at-least-once'} に含めます。例:
sender = session.sender("amq.topic;{link: {'reliability': 'at-least-once'}}")
8.1.2. 信頼性のないリンク リンクのコピーリンクがクリップボードにコピーされました!
unreliable リンクを明示的に要求できます。
unreliable リンク経由でキューからメッセージを取得すると、ブローカーは、メッセージが受信され、正常に対処されたことをコンシューマーが承認するのを待たずに即座にこれを削除します。
unreliable リンクの使用時のスループットの増加が分かりますが、これは確実にとは限りません。信頼性のないリンクに対する最も明確な使用は、大量のデータを高速に送信し、データ損失が問題ではないことです。
unreliable リンクのリクエスト
unreliable リンクを要求するには、受信側または送信者の link: {'reliability': 'unreliable'} アドレスを指定します。例:
- python
sender = session.sender("amq.topic;{link: {'reliability': 'unreliable'}}")
8.2. キューのサイズ リンクのコピーリンクがクリップボードにコピーされました!
8.2.1. キューのサイズの制御 リンクのコピーリンクがクリップボードにコピーされました!
qpid.max_size)および最大メッセージ数(qpid.max_count)を指定できます。
qpid.max_size はバイト単位で指定されます qpid.max_count。これはメッセージの数として指定されます。
qpid-config add queue my-queue --max-queue-size=204800000 --max-queue-count 5000
qpid.max_count および qpid.max_size ディレクティブは arguments の内にあり x-declare nodeます。たとえば、以下のアドレスは上記の qpid-config コマンドとしてキューを作成します。
- python
tx = ssn.sender("my-queue; {create: always, node: {x-declare: {'auto-delete': True, arguments:{'qpid.max_count': 5000, 'qpid.max_size': 204800000}}}}")
qpid.max_count 属性が適用されることに注意してください。
制限に達する場合の動作: qpid.policy_type
キューがこれらの制限に到達した場合の動作は設定可能です。デフォルトでは、非durable キューでは動作はになり rejectます。さらにキューへの送信を試みると、送信元で TargetCapacityExceeded 例外が発生します。
qpid.policy_type オプションを使用して設定されます。以下の値が使用できます。
- reject
- メッセージパブリッシャーは例外をスローし
TargetCapacityExceededます。これは、durableキュー以外のデフォルトの動作です。 - リング
- 新しいメッセージのスペースを作成するために、最も古いメッセージは削除されます。
ringします。
qpid-config add queue my-queue --max-queue-size=204800 --max-queue-count 5000 --limit-policy ring
- python
tx = ssn.sender("my-queue; {create: always, node: {x-declare: {'auto-delete': True, arguments:{'qpid.max_count': 5000, 'qpid.max_size': 204800, 'qpid.policy_type': 'ring'}}}}")
関連項目
8.2.2. キューのしきい値アラート リンクのコピーリンクがクリップボードにコピーされました!
qpid.max_size または qpid.max_count)が上限の 20% に達すると、ブローカーによって発行されます。図 50% は、broker オプションを使用してサーバー全体で設定でき --default-event-threshold-ratioます。これをゼロに設定すると、デフォルトですべてのキューでアラートが無効になります。さらに、キューの作成 qpid.alert_size 時 qpid.alert_count および作成時に、デフォルトのアラートしきい値を上書きできます。
qmf.default.topic/agent.ind.event.org_apache_qpid_broker.queueThresholdExceeded.#ます。アラートはマップメッセージとして送信されます。
- python
conn = Connection.establish("localhost:5672") session = conn.session() rcv = session.receiver("qmf.default.topic/agent.ind.event.org_apache_qpid_broker.queueThresholdExceeded.#") while True: event = rcv.fetch() print "Threshold exceeded on queue %s" % event.content[0]["_values"]["qName"] print " at a depth of %s messages, %s bytes" % (event.content[0]["_values"]["msgDepth"], event.content[0]["_values"]["byteDepth"]) session.acknowledge()
アラートリープ(Repeat Gap)
アラートメッセージがあふれるのを防ぐために、アラートメッセージには 60 秒の差があります。これにより、で異なる値を秒単位で指定 qpid.alert_repeat_gap すると、キューごとに上書きできます。
後方互換性エイリアス
以下のエイリアスは、以前のクライアントとの互換性を維持するために維持されます。
x-qpid-maximum-message-count以下と同等です。qpid.alert_countx-qpid-maximum-message-size以下と同等です。qpid.alert_sizex-qpid-minimum-alert-repeat-gap以下と同等です。qpid.alert_repeat_gap
8.3. プロデューサーフロー制御 リンクのコピーリンクがクリップボードにコピーされました!
8.3.1. フロー制御 リンクのコピーリンクがクリップボードにコピーされました!
ring ません。これらのキューは、ring メカニズム を介してキャパシティーへのアクセスを処理します。制限のある他のすべてのキューには、キューの作成時にブローカーによって設定される 2 つのしきい値があります。
- flow_stop_threshold
- 超過時にフロー制御を有効にするキューリソースの使用状況レベル。渡されたら、キューはオーバーフローが発生したと見なされ、プロデューサーフロー制御への送信メッセージの承認がブローカーによって承認されます。キューサイズまたはメッセージカウントの容量使用率の いずれか がこれをトリガーできることに注意してください。
- flow_resume_threshold
- 以下にドロップされた場合にフロー制御を無効にするキューリソースの使用状況レベル。渡された後、キューはオーバーフローの発生で考慮されなくなり、ブローカーは送信されたメッセージを再度確認します。プロデューサーフロー制御が非アクティブになるまで、キューサイズとメッセージ数の 両方 が、このしきい値を下回る必要があることに注意してください。
qpid.max_size (200MB)があり、ある場合 80、キューが 204800 または 163840 バイト flow_stop_threshold のエンキューメッセージである場合は、ブローカーがプロデューサーフロー制御を開始します。
flow_resume_threshold、プロデューサーフロー制御が停止します。flow_resume_threshold 上記の設定で flow_stop_threshold は、プロデューサーフロー制御のロックが明確な結果となるため、実行しないでください。
8.3.2. キューフローの状態 リンクのコピーリンクがクリップボードにコピーされました!
flowState ブール値によって決定できます。これが true フロー制御がアクティブである場合。
flowStoppedCount 増分するカウンターも含まれます。
8.3.3. ブローカーのデフォルトフローのしきい値 リンクのコピーリンクがクリップボードにコピーされました!
--default-flow-stop-threshold= この容量の割合(サイズまたはカウント)でフロー制御がアクティベートされます。--default-flow-resume-threshold= この容量の割合(サイズまたはカウント)でフロー制御が非アクティブになる
qpidd --default-flow-stop-threshold=90 --default-flow-resume-threshold=75
8.3.4. ブローカー全体のデフォルトのフローしきい値の無効化 リンクのコピーリンクがクリップボードにコピーされました!
qpidd --default-flow-stop-threshold=100 --default-flow-resume-threshold=100
8.3.5. キューごとのフローのしきい値 リンクのコピーリンクがクリップボードにコピーされました!
qpid.flow_stop_sizeintegerフロー停止のしきい値(バイト単位)。qpid.flow_resume_sizeintegerフローは、バイト単位でしきい値を再開します。qpid.flow_stop_countintegerフローがメッセージ数としてしきい値を停止します。qpid.flow_resume_countintegerフローはしきい値をメッセージ数として再開します。
8.4. クレジットベースのフロー制御 リンクのコピーリンクがクリップボードにコピーされました!
8.4.1. クレジットカードを使用したフロー制御 リンクのコピーリンクがクリップボードにコピーされました!
8.4.2. クレジット割り当てモード リンクのコピーリンクがクリップボードにコピーされました!
- ブローカーがメッセージを送信する前に、クレジットモード はサブスクライバーによって明示的に再発行される必要があります。
- ウィンドウモード では、受信したメッセージに対して、クレジットが自動的に再発行されます。このモードでは、クライアントは転送の完了をブローカーに通知してメッセージが受信されたことを示します。完了は基本的には承認の形ですが、所有権の譲渡の確認である受け入れと混同しないようにしてください。
8.5. 永続キュー リンクのコピーリンクがクリップボードにコピーされました!
8.5.1. 永続キュー リンクのコピーリンクがクリップボードにコピーされました!
8.5.2. 永続メッセージ リンクのコピーリンクがクリップボードにコピーされました!
8.5.3. アプリケーション内で永続キューを作成する リンクのコピーリンクがクリップボードにコピーされました!
- C++
Sender sender = session.createSender("important-messages; {create:always, node:{durable: True}")- python
newqueue = session.sender("important-messages; {create:always, node:{durable: True}")
durable 、 auto-delete自動削除される まで 永続性があることに注意してください。これが必要な動作である場合は、注意して検討してください。
8.5.4. メッセージを永続的としてマークします。 リンクのコピーリンクがクリップボードにコピーされました!
PERSISTENTます。たとえば、C++ では、以下のコードによりメッセージが永続化されます。
message.getDeliveryProperties().setDeliveryMode(PERSISTENT);
| 永続メッセージ AND 永続キュー | ディスクに書き込まれます。 |
| 永続メッセージと非永続キュー | ディスクに書き込まれない |
| 非永続的なメッセージ AND 非永続的なキュー | ディスクに書き込まれない |
| 非永続的なメッセージ AND 永続キュー | ディスクに書き込まれない |
8.5.5. 再起動後の永続メッセージ状態 リンクのコピーリンクがクリップボードにコピーされました!
redelivered フラグを設定します。
redelivered フラグを提案として扱う必要があります。
8.5.6. ジャーナルの説明 リンクのコピーリンクがクリップボードにコピーされました!
8.5.7. アプリケーションでのメッセージジャーナルの設定 リンクのコピーリンクがクリップボードにコピーされました!
qpid.file_size qpid.file_count x-declare 引数を指定し、指定します。
- python
tx = ssn.sender("my-queue;{create: always, node: {durable: True, x-declare: {arguments: {'qpid.file_size': 20, 'qpid.file_count': 12}}}}")
8.6. トランザクション リンクのコピーリンクがクリップボードにコピーされました!
8.6.1. トランザクション リンクのコピーリンクがクリップボードにコピーされました!
8.6.2. トランザクションの例 リンクのコピーリンクがクリップボードにコピーされました!
- .NET/C#
Connection connection = new Connection(broker); Session session = connection.createTransactionalSession(); ... if (smellsOk()) session.Commit(); else session.Rollback();- C++
Connection connection(broker); Session session = connection.createTransactionalSession(); ... if (smellsOk()) session.commit(); else session.rollback();
第9章 QPID 管理フレームワーク(QMF) リンクのコピーリンクがクリップボードにコピーされました!
9.1. qmf - Qpid 管理フレームワーク リンクのコピーリンクがクリップボードにコピーされました!
qmf.default.direct/broker qmf.default.direct です broker。メッセージには、送信者が応答を受信できる reply-to アドレスが含まれるはずです。
9.2. qmf バージョン リンクのコピーリンクがクリップボードにコピーされました!
9.3. アプリケーションからの交換の作成 リンクのコピーリンクがクリップボードにコピーされました!
test-fanout
Message(subject='broker', reply_to='qmf.default.topic/direct.6da5bfc3-44fb-4441-b834-6c5897b9606a;{node:{type:topic}, link:{x-declare:{auto-delete:True,exclusive:True}}}', correlation_id='1', properties={'qmf.opcode': '_method_request', 'x-amqp-0-10.app-id': 'qmf2', 'method': 'request'}, content={'_object_id': {'_object_name': 'org.apache.qpid.broker:broker:amqp-broker'}, '_method_name': 'create', '_arguments': {'strict': True, 'type': 'exchange', 'name': u'test-fanout', 'properties': {'exchange-type': u'fanout'}}})
9.4. QMF によるブローカー交換およびキュー設定 リンクのコピーリンクがクリップボードにコピーされました!
9.5. コマンドメッセージ リンクのコピーリンクがクリップボードにコピーされました!
qmf.default.direct/broker。
関連項目
9.6. qmf コマンドメッセージ構造 リンクのコピーリンクがクリップボードにコピーされました!
qmf コマンドメッセージの内容
qmf コマンドメッセージはマップメッセージです。QMF コマンドメッセージにはキーが含ま _object_id _method_name れ _argumentsます。
_object_id は必須です。この値は、コマンドのターゲットを特定するネストされたマップです。ブローカーとそのリソースを管理する QMF コマンドでは、_object_id マップには値が含ま _object_name れる単一の値が含まれ org.apache.qpid.broker:broker:amqp-brokerます。_object_name 値は 'package:class:id' の構文です。必要な値は、を使用してスキーマから取得でき qpid-toolます。
_method_name が _arguments 含まれます。
qmf コマンドメッセージプロパティー
2 つのメッセージプロパティー x-amqp-0-10.app-id とを設定 qmf.opcode する必要があります。プロパティーには常に値が含まれ、に値が qmf.opcode 含ま qmf2 れている x-amqp-0-10.app-id はずです _method_request。
Qmf コマンド応答
サーバーからレスポンスを受け取るには、QMF コマンドメッセージの reply-to アドレスを、メッセージを受信できるアドレスに設定します。コマンドメッセージがブローカーの QMF アドレスに送信されると、応答は指定された reply-to アドレスから送信されます。 amqp0-10 使用 qmf2時 に応答メッセージに x-amqp-0-10.app-id プロパティーが設定されています。
qmf.opcode メッセージプロパティーはに設定され _method_responseます。エラーが発生した場合、qmf.opcode プロパティーに値が含まれ _exceptionます。
_argumentsます。例外の場合には、例外の詳細はキーに対するネストされたマップ内にあり _valuesます。
9.7. コマンドの作成 リンクのコピーリンクがクリップボードにコピーされました!
- type
- 作成するオブジェクトのタイプ。これはキュー、交換、またはバインディングになります。
- Name
- 作成されるオブジェクトの名前。キューや交換の
name引数は単一の値です。たとえば、という名前のキューは name 引数をその値の文字列にmy-queue設定します。バインディングの名前では、パターンの exchange/queue/key を使用します。たとえば、: はamq.topic/my-queue/my-keyバインディングキーmy-queueとの交換amq.topicと交換を指定しますmy-key。 - properties
- 作成するオブジェクトの特定のプロパティー、値はネストされたマップです。
- Strict
- 厳密な引数は、現在無視されるブール値を取ります。この値は、認識されないプロパティーが指定されている場合にコマンドが失敗するかどうかを示します。
- auto_delete_timeout
- オプション。最初に自動削除キューを宣言する際に指定する場合は、削除が実行される遅延を秒単位で指定します。注記: 削除の対象となり、遅延が期限切れになる前にキューが再宣言される場合、キューは削除されません。
my-queueます。この例で my-queue は、10 秒後に自動削除するように設定されています。
- python
conn = Connection(opts.broker) try: conn.open() ssn = conn.session() snd = ssn.sender("qmf.default.direct/broker") reply_to = "reply-queue; {create:always, node:{x-declare:{auto-delete:true}}}" rcv = ssn.receiver(reply_to) content = { "_object_id": {"_object_name": "org.apache.qpid.broker:broker:amqp-broker"}, "_method_name": "create", "_arguments": {"type":"queue", "name":"my-queue", "properties":{"auto-delete":True, "qpid.auto_delete_timeout":10}} } request = Message(reply_to=reply_to, content=content) request.properties["x-amqp-0-10.app-id"] = "qmf2" request.properties["qmf.opcode"] = "_method_request" snd.send(request) try: response = rcv.fetch(timeout=opts.timeout) if response.properties['x-amqp-0-10.app-id'] == 'qmf2': if response.properties['qmf.opcode'] == '_method_response': return response.content['_arguments'] elif response.properties['qmf.opcode'] == '_exception': raise Exception("Error: %s" % response.content['_values']) else: raise Exception("Invalid response received, unexpected opcode: %s" % m) else: raise Exception("Invalid response received, not a qmfv2 method: %s" % m) except Empty: print "No response received!" except Exception, e: print e except ReceiverError, e: print e except KeyboardInterrupt: pass conn.close()
9.8. コマンドの削除 リンクのコピーリンクがクリップボードにコピーされました!
- type
- 削除するオブジェクトのタイプ。これはキュー、交換、またはバインディングになります。
- Name
- 削除するオブジェクトの名前。キューや交換の
name引数は単一の値ですmy-queue。バインディングの名前では、パターンの exchange/queue/key を使用します。たとえば、: はamq.topic/my-queue/my-keyバインディングキーmy-queueとの交換amq.topicと交換を指定しますmy-key。 - オプション
- キーを持つネストされたマップ
options。これは、現在使用されません。
9.9. コマンドの一覧表示 リンクのコピーリンクがクリップボードにコピーされました!
- python
Message(subject='broker', reply_to='qmf.default.topic/direct.8b59a7ae-93f1-4450-9e43-1b0665bf622b;{node:{type:topic}, link:{x-declare:{auto-delete:True,exclusive:True}}}', correlation_id='1', properties={'qmf.opcode': '_query_request', 'x-amqp-0-10.app-id': 'qmf2', 'method': 'request'}, content={'_what': 'OBJECT', '_schema_id': {'_class_name': 'exchange'}})
- python
Message(subject='broker', reply_to='qmf.default.topic/direct.7f703720-c815-4c79-986c-354b3963bc76;{node:{type:topic}, link:{x-declare:{auto-delete:True,exclusive:True}}}', correlation_id='1', properties={'qmf.opcode': '_query_request', 'x-amqp-0-10.app-id': 'qmf2', 'method': 'request'}, content={'_what': 'OBJECT', '_schema_id': {'_class_name': 'queue'}})
9.10. QMF を使用したキューおよび交換の作成 リンクのコピーリンクがクリップボードにコピーされました!
testます。
- python
Message(subject='broker', reply_to='qmf.default.topic/direct.8702f596-b112-427d-b93e-7e0ae28f2ae8;{node:{type:topic}, link:{x-declare:{auto-delete:True,exclusive:True}}}', correlation_id='1', properties={'qmf.opcode': '_method_request', 'x-amqp-0-10.app-id': 'qmf2', 'method': 'request'}, content={'_object_id': {'_object_name': 'org.apache.qpid.broker:broker:amqp-broker'}, '_method_name': 'create', '_arguments': {'strict': True, 'type': 'queue', 'name': u'test', 'properties': {}}})
test-fanoutます。
- python
Message(subject='broker', reply_to='qmf.default.topic/direct.81915d0a-d2e1-4cf9-9369-921bac725aab;{node:{type:topic}, link:{x-declare:{auto-delete:True,exclusive:True}}}', correlation_id='1', properties={'qmf.opcode': '_method_request', 'x-amqp-0-10.app-id': 'qmf2', 'method': 'request'}, content={'_object_id': {'_object_name': 'org.apache.qpid.broker:broker:amqp-broker'}, '_method_name': 'create', '_arguments': {'strict': True, 'type': 'exchange', 'name': u'test-fanout', 'properties': {'exchange-type': u'fanout'}}})
9.11. qmf イベント リンクのコピーリンクがクリップボードにコピーされました!
qmf.default.topic/agent.ind.event.org_apache_qpid_broker.$QMF_Event.#、$QMF_Event は以下の表で提供された QMF イベントの 1 つです。
| qmf イベント | 重大度 | 引数 |
|---|---|---|
|
clientConnect
|
inform
|
rhost、user、properties
|
|
clientConnectFail
|
WARN
|
rhost、user、reason、properties
|
|
clientDisconnect
|
inform
|
rhost、user、properties
|
|
brokerLinkUp
|
inform
|
rhost
|
|
brokerLinkDown
|
WARN
|
rhost
|
|
queueDeclare
|
inform
|
rhost, user, qName, durable, excl, autoDel, altEx, args, disp
|
|
queueDelete
|
inform
|
rhost、user、qName
|
|
exchangeDeclare
|
inform
|
rhost, user, exName, exType, altEx, durable, autoDel, args, disp
|
|
exchangeDelete
|
inform
|
rhost、user、exName
|
|
bind
|
inform
|
rhost, user, exName, qName, key, args
|
|
unbind
|
inform
|
rhost、user、exName、qName、key
|
|
subscribe
|
inform
|
rhost、user、qName、dest、excl、args
|
|
サブスクライブ解除
|
inform
|
rhost、user、dest
|
|
queueThresholdExceeded
|
WARN
|
qname、msgDepth、byteDepth
|
関連項目
9.12. qmf クライアント接続イベント リンクのコピーリンクがクリップボードにコピーされました!
| qmf キュー | 目的 |
|---|---|
|
qmf.default.topic/agent.ind.event.org_apache_qpid_broker.clientConnect.#
|
クライアント接続
|
|
qmf.default.topic/agent.ind.event.org_apache_qpid_broker.clientConnectFail.#
|
接続試行の失敗
|
|
qmf.default.topic/agent.ind.event.org_apache_qpid_broker.clientDisconnect.#
|
クライアントの接続解除
|
client_ppid[1]client_pidclient_process
Fetched Message(
properties={
u'qmf.agent': u'apache.org:qpidd:a2ff61bc-19b2-4078-8a7e-9c007151c79c',
'x-amqp-0-10.routing-key': u'agent.ind.event.org_apache_qpid_broker.clientConnect.info.apache_org.qpidd.a2ff61bc-19b2-4078-8a7e-9c007151c79c',
'x-amqp-0-10.app-id': 'qmf2',
u'qmf.content': u'_event',
u'qmf.opcode': u'_data_indication',
u'method': u'indication'},
content=[{
u'_schema_id': {
u'_package_name': 'org.apache.qpid.broker',
u'_class_name': 'clientConnect',
u'_type': '_event',
u'_hash': UUID('476930ed-01dd-9629-7f84-f42b4b0bc410')},
u'_timestamp': 1347032560197086881,
u'_values': {
u'user': 'anonymous',
u'properties': {
u'qpid.session_flow': 1,
u'qpid.client_ppid': 26139,
u'qpid.client_pid': 26876,
u'qpid.client_process': u'spout'},
u'rhost': '127.0.0.1:5672-127.0.0.1:43276'},
u'_severity': 6}])
Fri Sep 7 15:42:40 2012 org.apache.qpid.broker:clientConnect user=anonymous properties={
u'qpid.session_flow': 1,
u'qpid.client_ppid': 26139,
u'qpid.client_pid': 26876,
u'qpid.client_process': u'spout'}
rhost=127.0.0.1:5672-127.0.0.1:43276
9.13. ACL ルックアップクエリーメソッド リンクのコピーリンクがクリップボードにコピーされました!
# Catch 22: allow anonymous to access the lookup debug functions
acl allow-log anonymous create queue
acl allow-log anonymous all exchange name=qmf.*
acl allow-log anonymous all exchange name=amq.direct
acl allow-log anonymous all exchange name=qpid.management
acl allow-log anonymous access method name=Lookup*
Lookup およびです LookupPublish。
Lookup メソッドは、アクション、オブジェクト、およびプロパティーのセットに対する一般的なクエリーです。この LookupPublish 方法は、メッセージごとに最適化された fastpath クエリーです。
allow、、、deny allow-log、またはのいずれかになります deny-log。
method: Lookup
| 引数 | type | 方向 |
|---|---|---|
|
userId
|
long-string
|
I
|
|
action
|
long-string
|
I
|
|
オブジェクト
|
long-string
|
I
|
|
objectName
|
long-string
|
I
|
|
propertyMap
|
field-table
|
I
|
|
結果
|
long-string
|
O
|
メソッド: LookupPublish
| 引数 | type | 方向 |
|---|---|---|
|
userId
|
long-string
|
I
|
|
exchangeName
|
long-string
|
I
|
|
routingkey
|
long-string
|
I
|
|
結果
|
long-string
|
O
|
管理プロパティーと統計
| 要素 | type | access | description |
|---|---|---|---|
|
maxConnections
|
uint16
|
ReadOnly
|
許可される最大接続
|
| 要素 | type | access | description |
|---|---|---|---|
|
maxConnectionsPerIp
|
uint16
|
ReadOnly
|
許可される最大接続
|
|
maxConnectionsPerUser
|
uint16
|
ReadOnly
|
許可される最大接続
|
|
maxQueuesPerUser
|
uint16
|
ReadOnly
|
許可される最大キュー
|
|
connectionDenyCount
|
uint64
| |
拒否された接続数
|
|
queueQuotaDenyCount
|
uint64
| |
拒否されたキューの作成数
|
例
手順9.1 ACL ルックアップの例
- 以下で
acl-test-01-rules.acl再現した ACL ファイルのサンプルを使用して、ブローカーを起動しQPID_LOG_ENABLE=debug+:aclます。 - Python スクリプトを実行し
acl-test-01.pyます。 - Python プログラムの出力とブローカーログを確認します。
ACL ファイル acl-test-01-rules.acl
# acl-test-rules-00.acl
# 27-march-2012
group admins moe@COMPANY.COM \
larry@COMPANY.COM \
curly@COMPANY.COM \
shemp@COMPANY.COM
group auditors aaudit@COMPANY.COM baudit@COMPANY.COM caudit@COMPANY.COM \
daudit@COMPANY.COM eaduit@COMPANY.COM eaudit@COMPANY.COM
group tatunghosts tatung01@COMPANY.COM \
tatung02/x86.build.company.com@COMPANY.COM \
tatung03/x86.build.company.com@COMPANY.COM \
tatung04/x86.build.company.com@COMPANY.COM \
HTTP/tatung-test1.eng.company.com@COMPANY.COM
group publishusers publish@COMPANY.COM x-pubs@COMPANY.COM
# Admins: This should be the *only* group which ever gets "all" access
# to anything. Everything/everyone else must not be as permissive
acl allow-log admins all all
# Catch 22: allow anonymous to access the lookup debug functions
acl allow-log anonymous create queue
acl allow-log anonymous all exchange name=qmf.*
acl allow-log anonymous all exchange name=amq.direct
acl allow-log anonymous all exchange name=qpid.management
acl allow-log anonymous access method name=Lookup*
acl allow all publish exchange name=''
# Auditors
acl allow-log auditors all exchange name=company.topic routingkey=private.audit.*
# Tatung
acl allow-log tatunghosts publish exchange name=company.topic routingkey=tatung.*
acl allow-log tatunghosts publish exchange name=company.direct routingkey=tatung-service-queue
# Publish
acl allow-log publishusers create queue
acl allow-log publishusers publish exchange name=qpid.management routingkey=broker
acl allow-log publishusers publish exchange name=qmf.default.topic routingkey=*
acl allow-log publishusers publish exchange name=qmf.default.direct routingkey=*
# Consumers - everyone
acl allow-log all bind exchange name=company.topic routingkey=tatung.*
acl allow-log all bind exchange name=company.direct routingkey=tatung-service-queue
acl allow-log all consume queue
acl allow-log all access exchange
acl allow-log all access queue
acl allow-log all create queue name=tmp.* durable=false autodelete=true exclusive=true policytype=ring
# All else is denied
acl deny-log all all
Python スクリプト acl-test-01.py
# acl-test-00.py
# test driver for QPID-3918 lookup hooks.
#
# The broker is to use acl-test-00-rules.acl.
#
import sys
import qpid
import qmf
totalLookups = 0
failLookups = 0
exitOnError = True
#
# Run a type 1 lookup
# This is the general lookup
#
def Lookup(acl, userName, action, aclObj, aclObjName, propMap, expectedResult = ''):
global totalLookups
global failLookups
totalLookups += 1
result = acl.Lookup(userName, action, aclObj, aclObjName, propMap)
suffix = ''
if (expectedResult != ''):
if (result.result != expectedResult):
failLookups += 1
suffix = ', [ERROR: Expected ' + expectedResult + "]"
if (result.result is None):
suffix = suffix + ', [' + result.text + ']'
print 'Lookup : [name:', userName, ", action: ", action, ", object: ", aclObj, \
", objName: '", aclObjName, "', properties: ", propMap, \
"], [Result: ", result.result, "]", suffix
if (exitOnError and failLookups > 0):
sys.exit()
#
# Run a type 2 lookup
# This is a specific PUBLISH EXCHANGE ['user', 'exchangeName', 'routingKey'] lookup
#
def LookupPublish(acl, userName, exchName, keyName, expectedResult = ''):
global totalLookups
global failLookups
totalLookups += 1
result = acl.LookupPublish(userName, exchName, keyName)
suffix = ''
if (expectedResult != ''):
if (result.result != expectedResult):
failLookups += 1
suffix = ', [ERROR: Expected ' + expectedResult + "]"
if (result.result is None):
suffix = suffix + ', [' + result.text + ']'
print 'LookupPublish : [name:', userName, \
", exchName: '", exchName, "', key: ", keyName, \
"], [Result: ", result.result, "]", suffix
if (exitOnError and failLookups > 0):
sys.exit()
#
# AllBut
#
# Given All names and some names we don't want,
# return the All list with the targets removed
#
def AllBut(allList, removeList):
tmpList = allList[:]
for item in removeList:
try:
tmpList.remove(item)
except Exception, e:
print "ERROR in AllBut() \nallList = %s \nremoveList = %s \nerror = %s " \
% (allList, removeList, e)
return tmpList
#
# Main
#
# Fire up a session and get the acl methods
#
from qmf.console import Session
sess = Session()
broker = sess.addBroker()
acls = sess.getObjects(_class="acl", _package="org.apache.qpid.acl")
acl = acls[0]
# print acl.getMethods() # just to see the method names available
#
# define some group lists
#
g_admins = ['moe@COMPANY.COM', \
'larry@COMPANY.COM', \
'curly@COMPANY.COM', \
'shemp@COMPANY.COM']
g_auditors = [ 'aaudit@COMPANY.COM','baudit@COMPANY.COM','caudit@COMPANY.COM', \
'daudit@COMPANY.COM','eaduit@COMPANY.COM','eaudit@COMPANY.COM']
g_tatunghosts = ['tatung01@COMPANY.COM', \
'tatung02/x86.build.company.com@COMPANY.COM', \
'tatung03/x86.build.company.com@COMPANY.COM', \
'tatung04/x86.build.company.com@COMPANY.COM', \
'HTTP/tatung-test1.eng.company.com@COMPANY.COM']
g_publishusers = ['publish@COMPANY.COM', 'x-pubs@COMPANY.COM']
g_public = ['jpublic@COMPANY.COM', 'me@yahoo.com']
g_all = g_admins + g_auditors + g_tatunghosts + g_publishusers + g_public
action_all = ['consume','publish','create','access','bind','unbind','delete','purge','update']
#
# Run some tests
#
print '#'
print '# admin'
print '#'
for u in g_admins:
Lookup(acl, u, "create", "queue", "anything", {"durable":"true"}, "allow-log")
print '#'
print '# auditors'
print '#'
uInTest = g_auditors + g_admins
uOutTest = AllBut(g_all, uInTest)
for u in uInTest:
LookupPublish(acl, u, "company.topic", "private.audit.This", "allow-log")
for u in uInTest:
for a in action_all:
Lookup(acl, u, a, "exchange", "company.topic", {"routingkey":"private.audit.This"}, "allow-log")
for u in uOutTest:
LookupPublish(acl, u, "company.topic", "private.audit.This", "deny-log")
Lookup(acl, u, "bind", "exchange", "company.topic", {"routingkey":"private.audit.This"}, "deny-log")
print '#'
print '# tatungs'
print '#'
uInTest = g_admins + g_tatunghosts
uOutTest = AllBut(g_all, uInTest)
for u in uInTest:
LookupPublish(acl, u, "company.topic", "tatung.this2", "allow-log")
LookupPublish(acl, u, "company.direct", "tatung-service-queue", "allow-log")
for u in uOutTest:
LookupPublish(acl, u, "company.topic", "tatung.this2", "deny-log")
LookupPublish(acl, u, "company.direct", "tatung-service-queue", "deny-log")
for u in uOutTest:
for a in ["bind", "access"]:
Lookup(acl, u, a, "exchange", "company.topic", {"routingkey":"tatung.this2"}, "allow-log")
Lookup(acl, u, a, "exchange", "company.direct", {"routingkey":"tatung-service-queue"}, "allow-log")
print '#'
print '# publishusers'
print '#'
uInTest = g_admins + g_publishusers
uOutTest = AllBut(g_all, uInTest)
for u in uInTest:
LookupPublish(acl, u, "qpid.management", "broker", "allow-log")
LookupPublish(acl, u, "qmf.default.topic", "this3", "allow-log")
LookupPublish(acl, u, "qmf.default.direct", "this4", "allow-log")
for u in uOutTest:
LookupPublish(acl, u, "qpid.management", "broker", "deny-log")
LookupPublish(acl, u, "qmf.default.topic", "this3", "deny-log")
LookupPublish(acl, u, "qmf.default.direct", "this4", "deny-log")
for u in uOutTest:
for a in ["bind"]:
Lookup(acl, u, a, "exchange", "qpid.management", {"routingkey":"broker"}, "deny-log")
Lookup(acl, u, a, "exchange", "qmf.default.topic", {"routingkey":"this3"}, "deny-log")
Lookup(acl, u, a, "exchange", "qmf.default.direct", {"routingkey":"this4"}, "deny-log")
for a in ["access"]:
Lookup(acl, u, a, "exchange", "qpid.management", {"routingkey":"broker"}, "allow-log")
Lookup(acl, u, a, "exchange", "qmf.default.topic", {"routingkey":"this3"}, "allow-log")
Lookup(acl, u, a, "exchange", "qmf.default.direct", {"routingkey":"this4"}, "allow-log")
#
# Report statistics
#
print 'Total Lookups: ', totalLookups
print 'Failed Lookups: ', failLookups
#
# Close the session
#
sess.close()
9.14. クラスターで QMF の使用 リンクのコピーリンクがクリップボードにコピーされました!
第10章 Qpid メッセージング API リンクのコピーリンクがクリップボードにコピーされました!
10.1. 例外の処理 リンクのコピーリンクがクリップボードにコピーされました!
10.1.1. メッセージング例外リファレンス リンクのコピーリンクがクリップボードにコピーされました!
10.1.2. C++ メッセージング例外クラス階層 リンクのコピーリンクがクリップボードにコピーされました!
- MessagingException
- メッセージング例外のベースクラス。
- InvalidOptionString : public MessagingException
- 接続の設定に使用されるオプション文字列の構文が有効ではない場合に発生します。
- KeyError : public MessagingException
- 一部のローカルオブジェクトの検索に失敗したことを示すためにスローされます。たとえば、名前別にセッション、送信者、またはレシーバーの取得を試行する場合などです。
- LinkError : public MessagingException
- ベースクラスは、一部のローカルオブジェクトの検索に失敗したことを示すために発生する例外です。
- AddressError : public LinkError
- 一部のローカルオブジェクトの検索に失敗したことを示すためにスローされます。たとえば、名前別にセッション、送信者、またはレシーバーの取得を試行する場合などです。
- ResolutionError : public AddressError
- 構文が正しいアドレスを解決できず、使用できなくなると発生します。
- AssertionFailed : public ResolutionError
- ノードのアサート済みプロパティーが一致しないアドレスの送信元またはレシーバーの作成時にスローされます。
- NotFound : public ResolutionError
- 存在しないノードに送信者またはレシーバーの作成を試みる際に発生します。
- MalformedAddress : public AddressError
- 無効な構文のアドレス文字列が使用されると発生します。
- ReceiverError : public LinkError
- FetchError : public ReceiverError
- NoMessageAvailable : public FetchError
- Receiver::fetch()、Receiver::get()、および Session::nextReceiver()によりスローされ、タイムアウトが発生する前にメッセージがないことを示します。
- SenderError : public LinkError
- sendError : public SenderError
- TargetCapacityExceeded : public SendError
- 送信側が、ピアのターゲットノードが事前設定された容量を超過することにつながるメッセージの送信を試行することを示しています。
- SessionError : public MessagingException
- TransactionError : パブリック SessionError
- TransactionAborted : public TransactionError
- 再接続時に Session::commit()にスローされ、トランザクションが自動的に中止されます。
- TransactionUnknown : public TransactionError
- ブローカーでのトランザクションの結果(コミットまたはロールバック)は不明です。これは、コミットの送信後、応答を受け取る前に接続が失敗すると発生します。
- UnauthorizedAccess : public SessionError
- アプリケーションはそのピアが承認されていないことを示するためにスローされました。
- UnauthorizedAccess : public SessionError
- ConnectionError : public MessagingException
- TransportFailure : public MessagingException
- 根本的な接続の損失を示すためにスローされます。auto-reconnect を使用すると、ライブラリーによってキャプチャーされ、再接続の試行がトリガーされます。(設定がどのような設定によって)再接続に失敗すると、このクラスのインスタンスがスローされ、これを示します。
10.1.3. 接続例外 リンクのコピーリンクがクリップボードにコピーされました!
qpid::messaging namespace にあります。
- connection::Connection(const std::string&、const qpid::types:: Variant::Map&)
MessagingException指定されたマップにあるオプションのいずれかが認識されない場合。qpid::types::InvalidConversionオプションの値のタイプが間違っている場合。- connection::Connection(const std::string& url, const std::string& オプション)
MessagingException指定されたマップにあるオプションのいずれかが認識されない場合。qpid::types::InvalidConversionオプションの値のタイプが間違っている場合。InvalidOptionStringオプション文字列の形式が無効である場合。- Connection::setOption(const std::string& name, const qpid::types::Variant& value)
MessagingExceptionnamed オプションが認識されない場合。qpid::types::InvalidConversionオプションの値が正しくないタイプである場合。- Connection::open()
qpid::Url::Invalidurl が有効でない場合は(構築時に提供される url、またはオプション経由で提供された reconnect_urls のいずれか)。TransportFailure接続が確立されていない場合。ConnectionErrorAMQP 0-10 で定義された接続ハンドシェイクが完了するまでに、ブローカーが connection.close コントロールを送信する他の障害の場合。qpid::types::InvalidConversionブローカーが AMQP 0-10 仕様で定義されている 'known-host' フィールドに誤ってエンコードconnection.open-ok controlされた値を送信する場合。- Connection::isOpen()
- 例外は発生しません。
- Connection::close()
TargetCapacityExceeded接続に確立されたセッションのいずれかがメッセージを送信しようとすると、キューが設定された制限を超えることになります。UnauthorizedAccess接続に対して確立されたセッションのいずれかが、パーミッションが付与されていない操作の実行を試行する場合。SessionErrorAMQP 0-10 で定義されたexecution.exceptionコマンドが、クライアントが接続しているブローカーから受信されます。ConnectionErrorクライアントが接続しているブローカーが connection.close コントロールを送信する場合(たとえば、クライアントが行う直前にアクティブな接続を閉じる場合など)。MessagingExceptionクライアントが接続しているブローカーが session.detached コントロールを送信する場合(つまり、閉じるが進行中にアクティブなセッションを閉じる場合)。TransportFailureブローカーでクローズされた 'handshake' を実行しようとする際に接続が失われた場合。- Connection::createTransactionalSession(const std::string& name)
SessionErrorAMQP 0-10 で定義されたexecution.exceptionコマンドが、クライアントが接続しているブローカーから受信され、セッションのトランザクションを有効にする際に発生する可能性があります(例: 問題のブローカーがトランザクションをサポートしていない場合)。ConnectionErrorクライアントが接続しているブローカーがconnection.closeコントロールを送信する場合(つまり、ブローカーがアクティブな接続のクローズを開始する場合)。MessagingExceptionクライアントが接続しているブローカーが session.detached コントロールを送信する場合(たとえば、アクティブになる前にブローカーがセッションを閉じる場合)。TransportFailure接続が失われた場合(自動再接続が有効になっていない場合)。qpid::Url::Invalid再接続が有効で、reconnect_urlsオプション一覧の URL が無効である場合。qpid::types::InvalidConversionAMQP 0-10 仕様で定義されたconnection.open-okコントロールの 'known-host' フィールドに対して、ブローカーが誤ってエンコードされた値を送信する場合。- Connection::createSession(const std::string&)
ConnectionErrorクライアントが接続しているブローカーが connection.close control を送信する場合(つまり、ブローカーがアクティブな接続のクローズを開始する場合)。MessagingExceptionクライアントが接続しているブローカーがsession.detached制御を送信する場合(たとえば、ブローカーがセッションを閉じるとアクティブになる前にセッションを閉じる場合)。TransportFailure接続が失われた場合(自動再接続が有効になっていない場合)。qpid::Url::Invalid再接続が有効で、reconnect_urlsオプション一覧の URL が無効である場合。qpid::types::InvalidConversionAMQP 0-10 仕様で定義されている connection.open-ok コントロールのknown-host' ' フィールドに誤ってエンコードされた値を送信する場合。- Connection::getSession(const std::string&)
KeyError指定した名前のセッションが存在しない場合。- Connection::getAuthenticatedUsername()
- 例外は発生しません。
10.1.4. セッション例外 リンクのコピーリンクがクリップボードにコピーされました!
qpid::messaging namespace にあります。
- Session::close()
TargetCapacityExceededセッションが、設定された制限を超えるメッセージを送信しようとすると、キューが設定された制限を超えることになります。UnauthorizedAccessセッションがパーミッションを付与されていない操作を実行しようとすると、SessionErrorAMQP 0-10 で定義されたexecution.exceptionコマンドが、クライアントが接続しているブローカーから受信されます。ConnectionErrorクライアントが接続しているブローカーがconnection.closeコントロールを送信する場合(つまり、ブローカーがアクティブな接続のクローズを開始する場合)。MessagingExceptionクライアントが接続しているブローカーがsession.detached制御を送信する場合(つまり、ブローカーがアクティブなセッションのクローズを開始する場合)。TransportFailure接続が失われた場合(自動再接続が有効になっていない場合)。- Session::commit()
TransactionAborted元の AMQP 0-10 セッションが失われた場合(フェイルオーバーにより)、自動ロールバックが強制されます。TargetCapacityExceededセッションが、設定された制限を超えるメッセージを送信しようとすると、キューが設定された制限を超えることになります。UnauthorizedAccessセッションがパーミッションを付与されていない操作を実行しようとすると、SessionErrorAMQP 0-10 で定義されたexecution.exceptionコマンドが、クライアントが接続しているブローカーから受信されます。ConnectionErrorクライアントが接続しているブローカーがconnection.closeコントロールを送信する場合(つまり、ブローカーがアクティブな接続のクローズを開始する場合)。MessagingExceptionクライアントが接続するブローカーが session.detached コントロールを送信する場合(つまり、ブローカーがアクティブなセッションを閉じる場合)。TransportFailure接続が失われた場合(自動再接続が有効になっていない場合)。- Session::rollback()
TargetCapacityExceededセッションが、設定された制限を超えるメッセージを送信しようとすると、キューが設定された制限を超えることになります。UnauthorizedAccessセッションがパーミッションを付与されていない操作を実行しようとすると、SessionErrorAMQP 0-10 で定義された execution.exception コマンドが、クライアントが接続先のブローカーから受信される場合。ConnectionErrorクライアントが接続しているブローカーがconnection.closeコントロールを送信する場合(つまり、ブローカーがアクティブな接続のクローズを開始する場合)。MessagingExceptionクライアントが接続しているブローカーがsession.detached制御を送信する場合(つまり、ブローカーがアクティブなセッションのクローズを開始する場合)。TransportFailure接続が失われた場合(自動再接続が有効になっていない場合)。- session::acknowledge(bool)
TargetCapacityExceededセッションが、設定された制限を超えるメッセージを送信しようとすると、キューが設定された制限を超えることになります。UnauthorizedAccessセッションがパーミッションを付与されていない操作を実行しようとすると、SessionErrorAMQP 0-10 で定義された execution.exception コマンドが、クライアントが接続先のブローカーから受信される場合。ConnectionErrorクライアントが接続しているブローカーがconnection.closeコントロールを送信する場合(つまり、ブローカーがアクティブな接続のクローズを開始する場合)。MessagingExceptionクライアントが接続しているブローカーがsession.detached制御を送信する場合(つまり、ブローカーがアクティブなセッションのクローズを開始する場合)。TransportFailure接続が失われた場合(自動再接続が有効になっていない場合)。- session::acknowledge(Message&, bool)
TargetCapacityExceededセッションが、設定された制限を超えるメッセージを送信しようとすると、キューが設定された制限を超えることになります。UnauthorizedAccessセッションがパーミッションを付与されていない操作を実行しようとすると、SessionErrorAMQP 0-10 で定義された execution.exception コマンドが、クライアントが接続先のブローカーから受信される場合。ConnectionErrorクライアントが接続しているブローカーがconnection.closeコントロールを送信する場合(つまり、ブローカーがアクティブな接続のクローズを開始する場合)。MessagingExceptionクライアントが接続しているブローカーがsession.detached制御を送信する場合(つまり、ブローカーがアクティブなセッションのクローズを開始する場合)。TransportFailure接続が失われた場合(自動再接続が有効になっていない場合)。- session::acknowledgeUpTo(Message&, bool)
TargetCapacityExceededセッションが、設定された制限を超えるメッセージを送信しようとすると、キューが設定された制限を超えることになります。UnauthorizedAccessセッションがパーミッションを付与されていない操作を実行しようとすると、SessionErrorAMQP 0-10 で定義されたexecution.exceptionコマンドが、クライアントが接続しているブローカーから受信されます。ConnectionErrorクライアントが接続しているブローカーがconnection.closeコントロールを送信する場合(つまり、ブローカーがアクティブな接続のクローズを開始する場合)。MessagingExceptionクライアントが接続しているブローカーがsession.detached制御を送信する場合(つまり、ブローカーがアクティブなセッションのクローズを開始する場合)。TransportFailure接続が失われた場合(自動再接続が有効になっていない場合)。- Session::reject(Message&)
TargetCapacityExceededセッションが、設定された制限を超えるメッセージを送信しようとすると、キューが設定された制限を超えることになります。UnauthorizedAccessセッションがパーミッションを付与されていない操作を実行しようとすると、AMQP 0-10 で定義されているように execution.exception コマンドがクライアントの接続先のブローカーから受信されたSessionError場合に実行されます。ConnectionErrorクライアントが接続しているブローカーがconnection.closeコントロールを送信する場合(つまり、ブローカーがアクティブな接続のクローズを開始する場合)。MessagingExceptionクライアントが接続しているブローカーがsession.detached制御を送信する場合(つまり、ブローカーがアクティブなセッションのクローズを開始する場合)。TransportFailure接続が失われた場合(自動再接続が有効になっていない場合)。- session::release(Message&)
TargetCapacityExceededセッションが、設定された制限を超えるメッセージを送信しようとすると、キューが設定された制限を超えることになります。UnauthorizedAccessセッションがパーミッションを付与されていない操作を実行しようとすると、SessionErrorAMQP 0-10 で定義されたexecution.exceptionコマンドが、クライアントが接続しているブローカーから受信されます。ConnectionErrorクライアントが接続しているブローカーがconnection.closeコントロールを送信する場合(つまり、ブローカーがアクティブな接続のクローズを開始する場合)。MessagingExceptionクライアントが接続しているブローカーがsession.detached制御を送信する場合(つまり、ブローカーがアクティブなセッションのクローズを開始する場合)。接続が失われた場合に TransportFailure(自動再接続が有効である場合は再確立できません)。- Session::sync(bool)
TargetCapacityExceededセッションが、設定された制限を超えるメッセージを送信しようとすると、キューが設定された制限を超えることになります。UnauthorizedAccessセッションがパーミッションを付与されていない操作を実行しようとすると、SessionErrorAMQP 0-10 で定義されたexecution.exceptionコマンドが、クライアントが接続しているブローカーから受信されます。ConnectionErrorクライアントが接続しているブローカーがconnection.closeコントロールを送信する場合(つまり、ブローカーがアクティブな接続のクローズを開始する場合)。MessagingExceptionクライアントが接続しているブローカーがsession.detached制御を送信する場合(つまり、ブローカーがアクティブなセッションのクローズを開始する場合)。TransportFailure接続が失われた場合(自動再接続が有効になっていない場合)。- Session::getReceivable()
TargetCapacityExceededセッションが、設定された制限を超えるメッセージを送信しようとすると、キューが設定された制限を超えることになります。UnauthorizedAccessセッションがパーミッションを付与されていない操作を実行しようとすると、SessionErrorAMQP 0-10 で定義されたexecution.exceptionコマンドが、クライアントが接続しているブローカーから受信されます。ConnectionErrorクライアントが接続しているブローカーがconnection.closeコントロールを送信する場合(つまり、ブローカーがアクティブな接続のクローズを開始する場合)。MessagingExceptionクライアントが接続しているブローカーがsession.detached制御を送信する場合(つまり、ブローカーがアクティブなセッションのクローズを開始する場合)。TransportFailure接続が失われた場合(自動再接続が有効になっていない場合)。- Session::getUnsettledAcks()
TargetCapacityExceededセッションが、設定された制限を超えるメッセージを送信しようとすると、キューが設定された制限を超えることになります。UnauthorizedAccessセッションがパーミッションを付与されていない操作を実行しようとすると、SessionErrorAMQP 0-10 で定義されたexecution.exceptionコマンドが、クライアントが接続しているブローカーから受信されます。ConnectionErrorクライアントが接続しているブローカーがconnection.closeコントロールを送信する場合(つまり、ブローカーがアクティブな接続のクローズを開始する場合)。MessagingExceptionクライアントが接続しているブローカーがsession.detached制御を送信する場合(つまり、ブローカーがアクティブなセッションのクローズを開始する場合)。接続が失われた場合に TransportFailure(自動再接続が有効である場合は再確立できません)。- session::nextReceiver(Receiver&, Duration)
TargetCapacityExceededセッションが、設定された制限を超えるメッセージを送信しようとすると、キューが設定された制限を超えることになります。UnauthorizedAccessセッションがパーミッションを付与されていない操作を実行しようとすると、SessionErrorAMQP 0-10 で定義されたexecution.exceptionコマンドが、クライアントが接続しているブローカーから受信されます。ConnectionErrorクライアントが接続しているブローカーがconnection.closeコントロールを送信する場合(つまり、ブローカーがアクティブな接続のクローズを開始する場合)。MessagingExceptionクライアントが接続するブローカーが session.detached コントロールを送信する場合(つまり、ブローカーがアクティブなセッションを閉じる場合)。TransportFailure接続が失われた場合(自動再接続が有効になっていない場合)。- Session::nextReceiver(Duration)
Receiver::NoMessageAvailable時間内にメッセージが利用可能になっていない場合。TargetCapacityExceededセッションが、設定された制限を超えるメッセージを送信しようとすると、キューが設定された制限を超えることになります。UnauthorizedAccessセッションがパーミッションを付与されていない操作を実行しようとすると、AMQP 0-10 で定義されているように execution.exception コマンドがクライアントの接続先のブローカーから受信されたSessionError場合に実行されます。ConnectionErrorクライアントが接続しているブローカーがconnection.closeコントロールを送信する場合(つまり、ブローカーがアクティブな接続のクローズを開始する場合)。MessagingExceptionクライアントが接続しているブローカーがsession.detached制御を送信する場合(つまり、ブローカーがアクティブなセッションのクローズを開始する場合)。TransportFailure接続が失われた場合(自動再接続が有効になっていない場合)。- session::createSender(const Address&)
ResolutionErrorアドレスの解決にエラーがある場合。TargetCapacityExceededセッションが、設定された制限を超えるメッセージを送信しようとすると、キューが設定された制限を超えることになります。UnauthorizedAccessセッションがパーミッションを付与されていない操作を実行しようとすると、SessionErrorAMQP 0-10 で定義されたexecution.exceptionコマンドが、クライアントが接続しているブローカーから受信されます。ConnectionErrorクライアントが接続しているブローカーがconnection.closeコントロールを送信する場合(つまり、ブローカーがアクティブな接続のクローズを開始する場合)。MessagingExceptionクライアントが接続するブローカーが session.detached コントロールを送信する場合(つまり、ブローカーがアクティブなセッションを閉じる場合)。TransportFailure接続が失われた場合(自動再接続が有効になっていない場合)。- Session::createSender(const std::string&)
ResolutionErrorアドレスの解決にエラーがある場合。MalformedAddressアドレス文字列の構文が有効ではない場合。TargetCapacityExceededセッションが、設定された制限を超えるメッセージを送信しようとすると、キューが設定された制限を超えることになります。UnauthorizedAccessセッションがパーミッションを付与されていない操作を実行しようとすると、SessionErrorAMQP 0-10 で定義された execution.exception コマンドが、クライアントが接続先のブローカーから受信される場合。ConnectionErrorクライアントが接続しているブローカーがconnection.closeコントロールを送信する場合(つまり、ブローカーがアクティブな接続のクローズを開始する場合)。MessagingExceptionクライアントが接続しているブローカーがsession.detached制御を送信する場合(つまり、ブローカーがアクティブなセッションのクローズを開始する場合)。TransportFailure接続が失われた場合(自動再接続が有効になっていない場合)。- session::createReceiver(const Address&)
ResolutionErrorアドレスの解決にエラーがある場合。TargetCapacityExceededセッションが、設定された制限を超えるメッセージを送信しようとすると、キューが設定された制限を超えることになります。UnauthorizedAccessセッションがパーミッションを付与されていない操作を実行しようとすると、SessionErrorAMQP 0-10 で定義された execution.exception コマンドが、クライアントが接続先のブローカーから受信される場合。ConnectionErrorクライアントが接続しているブローカーが connection.close control を送信する場合(つまり、ブローカーがアクティブな接続のクローズを開始する場合)。MessagingExceptionクライアントが接続するブローカーが session.detached コントロールを送信する場合(つまり、ブローカーがアクティブなセッションを閉じる場合)。TransportFailure接続が失われた場合(自動再接続が有効になっていない場合)。- Session::createReceiver(const std::string&)
ResolutionErrorアドレスの解決にエラーがある場合。MalformedAddressアドレス文字列の構文が有効ではない場合。TargetCapacityExceededセッションが、設定された制限を超えるメッセージを送信しようとすると、キューが設定された制限を超えることになります。UnauthorizedAccessセッションがパーミッションを付与されていない操作を実行しようとすると、SessionErrorAMQP 0-10 で定義された execution.exception コマンドが、クライアントが接続先のブローカーから受信される場合。ConnectionErrorクライアントが接続しているブローカーがconnection.closeコントロールを送信する場合(つまり、ブローカーがアクティブな接続のクローズを開始する場合)。MessagingExceptionクライアントが接続しているブローカーがsession.detached制御を送信する場合(つまり、ブローカーがアクティブなセッションのクローズを開始する場合)。TransportFailure接続が失われた場合(自動再接続が有効になっていない場合)。- Session::getSender(const std::string&)
KeyError指定の名前の送信者がない場合。- Session::getReceiver(const std::string&)
- 指定の名前のレシーバーがない場合、KeyError
- Session::checkError()
qpid::messaging::SessionErrorAMQP 0-10 で定義された execution.exception コマンドが、クライアントが接続先のブローカーから受信される場合。qpid::messaging::ConnectionErrorクライアントが接続しているブローカーがconnection.closeコントロールを送信する場合(つまり、ブローカーがアクティブな接続のクローズを開始する場合)。qpid::messaging::MessagingExceptionクライアントが接続するブローカーが session.detached コントロールを送信する場合(つまり、ブローカーがアクティブなセッションを閉じる場合)。- Session::getConnection()
- 例外は発生しません。
- Session::hasError()
- 例外は発生しません。
10.1.5. 送信者例外 リンクのコピーリンクがクリップボードにコピーされました!
qpid::messaging namespace にあります。
- sender::send(const Message& message, bool)
TargetCapacityExceededセッションが、設定された制限を超えるメッセージを送信しようとすると、キューが設定された制限を超えることになります。UnauthorizedAccessセッションがパーミッションを付与されていない操作を実行しようとすると、SessionErrorAMQP 0-10 で定義されたexecution.exceptionコマンドが、クライアントが接続しているブローカーから受信されます。ConnectionErrorクライアントが接続しているブローカーがconnection.closeコントロールを送信する場合(つまり、ブローカーがアクティブな接続のクローズを開始する場合)。MessagingExceptionクライアントが接続するブローカーが session.detached コントロールを送信する場合(つまり、ブローカーがアクティブなセッションを閉じる場合)。TransportFailure接続が失われた場合(自動再接続が有効になっていない場合)。- Sender::close()
TargetCapacityExceededセッションが、設定された制限を超えるメッセージを送信しようとすると、キューが設定された制限を超えることになります。UnauthorizedAccessセッションがパーミッションを付与されていない操作を実行しようとすると、SessionErrorAMQP 0-10 で定義されたexecution.exceptionコマンドが、クライアントが接続しているブローカーから受信されます。ConnectionErrorクライアントが接続しているブローカーがconnection.closeコントロールを送信する場合(つまり、ブローカーがアクティブな接続のクローズを開始する場合)。MessagingExceptionクライアントが接続しているブローカーがsession.detached制御を送信する場合(つまり、ブローカーがアクティブなセッションのクローズを開始する場合)。TransportFailure接続が失われた場合(自動再接続が有効になっていない場合)。- Sender::setCapacity(uint32_t)
TargetCapacityExceededセッションが、設定された制限を超えるメッセージを送信しようとすると、キューが設定された制限を超えることになります。UnauthorizedAccessセッションがパーミッションを付与されていない操作を実行しようとすると、SessionErrorAMQP 0-10 で定義されたexecution.exceptionコマンドが、クライアントが接続しているブローカーから受信されます。ConnectionErrorクライアントが接続しているブローカーがconnection.closeコントロールを送信する場合(つまり、ブローカーがアクティブな接続のクローズを開始する場合)。MessagingExceptionクライアントが接続しているブローカーがsession.detached制御を送信する場合(つまり、ブローカーがアクティブなセッションのクローズを開始する場合)。TransportFailure接続が失われた場合(自動再接続が有効になっていない場合)。- Sender::getUnsettled()
TargetCapacityExceededセッションが、設定された制限を超えるメッセージを送信しようとすると、キューが設定された制限を超えることになります。UnauthorizedAccessセッションがパーミッションを付与されていない操作を実行しようとすると、SessionErrorAMQP 0-10 で定義されたexecution.exceptionコマンドが、クライアントが接続しているブローカーから受信されます。ConnectionErrorクライアントが接続しているブローカーがconnection.closeコントロールを送信する場合(つまり、ブローカーがアクティブな接続のクローズを開始する場合)。MessagingExceptionクライアントが接続しているブローカーがsession.detached制御を送信する場合(つまり、ブローカーがアクティブなセッションのクローズを開始する場合)。TransportFailure接続が失われた場合(自動再接続が有効になっていない場合)。- Sender::getAvailable()
TargetCapacityExceededセッションが、設定された制限を超えるメッセージを送信しようとすると、キューが設定された制限を超えることになります。UnauthorizedAccessセッションがパーミッションを付与されていない操作を実行しようとすると、SessionErrorAMQP 0-10 で定義されたexecution.exceptionコマンドが、クライアントが接続しているブローカーから受信されます。ConnectionErrorクライアントが接続しているブローカーがconnection.closeコントロールを送信する場合(つまり、ブローカーがアクティブな接続のクローズを開始する場合)。MessagingExceptionクライアントが接続しているブローカーがsession.detached制御を送信する場合(つまり、ブローカーがアクティブなセッションのクローズを開始する場合)。TransportFailure接続が失われた場合(自動再接続が有効になっていない場合)。- Sender::getCapacity()
- 例外は発生しません。
- Sender::getName()
- 例外は発生しません。
- Sender::getSession()
- 例外は発生しません。
10.1.6. receiver 例外 リンクのコピーリンクがクリップボードにコピーされました!
qpid::messaging namespace にあります。
- receiver::get(Message& message, Duration timeout=Duration::FOREVER)
TargetCapacityExceededセッションが、設定された制限を超えるメッセージを送信しようとすると、キューが設定された制限を超えることになります。UnauthorizedAccessセッションがパーミッションを付与されていない操作を実行しようとすると、SessionErrorAMQP 0-10 で定義されたexecution.exceptionコマンドが、クライアントが接続しているブローカーから受信されます。ConnectionErrorクライアントが接続しているブローカーがconnection.closeコントロールを送信する場合(つまり、ブローカーがアクティブな接続のクローズを開始する場合)。MessagingExceptionクライアントが接続しているブローカーがsession.detached制御を送信する場合(つまり、ブローカーがアクティブなセッションのクローズを開始する場合)。TransportFailure接続が失われた場合(自動再接続が有効になっていない場合)。- receiver::Message get(Duration timeout=Duration::FOREVER)
NoMessageAvailable指定されたタイムアウトを待機した後に指定のタイムアウトを待機するメッセージがない場合、または Receiver が閉じられている場合は true にisClose()なります。TargetCapacityExceededセッションが、設定された制限を超えるメッセージを送信しようとすると、キューが設定された制限を超えることになります。UnauthorizedAccessセッションがパーミッションを付与されていない操作を実行しようとすると、SessionErrorAMQP 0-10 で定義された execution.exception コマンドが、クライアントが接続先のブローカーから受信される場合。ConnectionErrorクライアントが接続しているブローカーがconnection.closeコントロールを送信する場合(つまり、ブローカーがアクティブな接続のクローズを開始する場合)。MessagingExceptionクライアントが接続しているブローカーがsession.detached制御を送信する場合(つまり、ブローカーがアクティブなセッションのクローズを開始する場合)。TransportFailure接続が失われた場合(自動再接続が有効になっていない場合)。- receiver::fetch(Message& message, Duration timeout=Duration::FOREVER)
TargetCapacityExceededセッションが、設定された制限を超えるメッセージを送信しようとすると、キューが設定された制限を超えることになります。UnauthorizedAccessセッションがパーミッションを付与されていない操作を実行しようとすると、SessionErrorAMQP 0-10 で定義された execution.exception コマンドが、クライアントが接続先のブローカーから受信される場合。ConnectionErrorクライアントが接続しているブローカーがconnection.closeコントロールを送信する場合(つまり、ブローカーがアクティブな接続のクローズを開始する場合)。MessagingExceptionクライアントが接続しているブローカーがsession.detached制御を送信する場合(つまり、ブローカーがアクティブなセッションのクローズを開始する場合)。TransportFailure接続が失われた場合(自動再接続が有効になっていない場合)。- receiver::fetch(Duration timeout=Duration::FOREVER)
NoMessageAvailable指定されたタイムアウトを待機した後に指定のタイムアウトを待機するメッセージがない場合、または Receiver が閉じられている場合は true にisClose()なります。TargetCapacityExceededセッションが、設定された制限を超えるメッセージを送信しようとすると、キューが設定された制限を超えることになります。UnauthorizedAccessセッションがパーミッションを付与されていない操作を実行しようとすると、SessionErrorAMQP 0-10 で定義されたexecution.exceptionコマンドが、クライアントが接続しているブローカーから受信されます。ConnectionErrorクライアントが接続しているブローカーがconnection.closeコントロールを送信する場合(つまり、ブローカーがアクティブな接続のクローズを開始する場合)。MessagingExceptionクライアントが接続しているブローカーがsession.detached制御を送信する場合(つまり、ブローカーがアクティブなセッションのクローズを開始する場合)。TransportFailure接続が失われた場合(自動再接続が有効になっていない場合)。- Receiver::setCapacity(uint32_t)
TargetCapacityExceededセッションが、設定された制限を超えるメッセージを送信しようとすると、キューが設定された制限を超えることになります。UnauthorizedAccessセッションがパーミッションを付与されていない操作を実行しようとすると、SessionErrorAMQP 0-10 で定義されたexecution.exceptionコマンドが、クライアントが接続しているブローカーから受信されます。ConnectionErrorクライアントが接続しているブローカーがconnection.closeコントロールを送信する場合(つまり、ブローカーがアクティブな接続のクローズを開始する場合)。MessagingExceptionクライアントが接続しているブローカーがsession.detached制御を送信する場合(つまり、ブローカーがアクティブなセッションのクローズを開始する場合)。TransportFailure接続が失われた場合(自動再接続が有効になっていない場合)。- Receiver::getAvailable()
TargetCapacityExceededセッションが、設定された制限を超えるメッセージを送信しようとすると、キューが設定された制限を超えることになります。UnauthorizedAccessセッションがパーミッションを付与されていない操作を実行しようとすると、SessionErrorAMQP 0-10 で定義されたexecution.exceptionコマンドが、クライアントが接続しているブローカーから受信されます。ConnectionErrorクライアントが接続しているブローカーがconnection.closeコントロールを送信する場合(つまり、ブローカーがアクティブな接続のクローズを開始する場合)。MessagingExceptionクライアントが接続しているブローカーがsession.detached制御を送信する場合(つまり、ブローカーがアクティブなセッションのクローズを開始する場合)。TransportFailure接続が失われた場合(自動再接続が有効になっていない場合)。- Receiver::getUnsettled()
TargetCapacityExceededセッションが、設定された制限を超えるメッセージを送信しようとすると、キューが設定された制限を超えることになります。UnauthorizedAccessセッションがパーミッションを付与されていない操作を実行しようとすると、SessionErrorAMQP 0-10 で定義されたexecution.exceptionコマンドが、クライアントが接続しているブローカーから受信されます。ConnectionErrorクライアントが接続しているブローカーがconnection.closeコントロールを送信する場合(つまり、ブローカーがアクティブな接続のクローズを開始する場合)。MessagingExceptionクライアントが接続しているブローカーがsession.detached制御を送信する場合(つまり、ブローカーがアクティブなセッションのクローズを開始する場合)。TransportFailure接続が失われた場合(自動再接続が有効になっていない場合)。- Receiver::close()
TargetCapacityExceededセッションが、設定された制限を超えるメッセージを送信しようとすると、キューが設定された制限を超えることになります。UnauthorizedAccessセッションがパーミッションを付与されていない操作を実行しようとすると、SessionErrorAMQP 0-10 で定義されたexecution.exceptionコマンドが、クライアントが接続しているブローカーから受信されます。ConnectionErrorクライアントが接続しているブローカーがconnection.closeコントロールを送信する場合(つまり、ブローカーがアクティブな接続のクローズを開始する場合)。MessagingExceptionクライアントが接続しているブローカーがsession.detached制御を送信する場合(つまり、ブローカーがアクティブなセッションのクローズを開始する場合)。TransportFailure接続が失われた場合(自動再接続が有効になっていない場合)。- Receiver::isClosed()
- 例外は発生しません。
- Receiver::getCapacity()
- 例外は発生しません。
- Receiver::getName()
- 例外は発生しません。
- Receiver::getSession()
- 例外は発生しません。
第11章 addresses リンクのコピーリンクがクリップボードにコピーされました!
11.1. X 宣言パラメーター リンクのコピーリンクがクリップボードにコピーされました!
x-declare 一部に指定できます。
| パラメーター | 使用方法 |
|---|---|
auto-delete
| boolean キュー/交換が自動的に削除されるべきかどうかの指定
|
exclusive
| boolean キュー/交換の排他的性の指定
|
alternate-exchange
|
このキューが削除される際にメッセージをルーティングする代替の交換 / メッセージの一致するバインドを見つけることができない
|
arguments
|
キュー/交換に特に使用できる引数を含むネストされたマップ。詳細はを https://cwiki.apache.org/confluence/display/qpid/Qpid+extensions+to+AMQP 参照してください。
|
11.2. アドレス文字列オプションのリファレンス リンクのコピーリンクがクリップボードにコピーされました!
| オプション | 値 | セマンティクス |
|---|---|---|
assert
|
、
always、sender またはのいずれ neverか。 receiver
|
ノードオプションで指定されたプロパティーがアドレスを解決するすべてのプロパティーをアサートします。そうでない場合は解決に失敗し、例外が発生します。
|
create
|
、
always、sender またはのいずれ neverか。 receiver
|
アドレスが存在しないかどうかが参照するノードを作成します。ノードが存在する場合、エラーは発生しません。ノードの詳細は、node オプションで指定できます。
|
delete
|
、
always、sender またはのいずれ neverか。 receiver
|
送信者またはレシーバーが閉じられたときにノードを削除します。
|
node
| node プロパティーを含むネストされたマップ。
|
アドレスが参照するノードのプロパティーを指定します。これらは
assert または create オプションとともに使用されます。
|
link
| link プロパティーを含むネストされたマップ。
|
クライアントアプリケーションからターゲット/ソースアドレスへの、概念リンクの構築を制御するために使用されます。
|
mode
|
以下のいずれか
browseになります。 consume
|
このオプションは、キューに解決するソースアドレスにのみ関連します。指定されている場合、受信側に配信されるメッセージは削除されず、キューに残されます。consume が指定されていると、通常の動作が適用されます。クライアントが受信を認識すると、メッセージはキューから削除されます。
|
11.3. ノードのプロパティー リンクのコピーリンクがクリップボードにコピーされました!
| property | 値 | セマンティクス |
|---|---|---|
type
|
以下のいずれか
topicになります。 queue
|
ノードのタイプを示します。
|
durable
|
以下のいずれか
Trueになります。 False
|
ブローカーが再起動した場合など、ノードが揮発性ストレージの損失後も存続するかどうかを示します。
|
x-declare
|
値が AMQP 0-10
queue-declare または exchange-declare コマンドの有効なフィールドに対応するネストされたマップ。
|
これらの値は、作成またはアサーションプロセスを微調整するために使用されます。ただし、これはプロトコル固有であることに注意してください。
|
x-bindings
|
各バインディングがマップによって表されるネストされたリスト。バインディングのマップのエントリーには、AMQP 0-10 バインディングを記述するフィールドが含まれます。以下は x-bindings の形式です。
|
create オプションと併せて、これらのバインディングはアドレスが解決されると、これらのバインディングが確立されます。assert オプションとともに、これらの各バインディングが存在するかどうかは解決中に検証されます。ここでも、これはプロトコル固有です。
|
properties |
AMQP 1.0 プロパティーのネストされたマップ。
| で指定したプロパティーのネストされたマップ properties は x-declare、の使用よりも推奨されます。これにより、プロパティーの使用時にネストされたプロパティーのマップが生成されます。 |
capabilities | AMQP 1.0 の機能を表す単一の文字列または文字列のリスト。 | ソースまたはターゲットから要求される AMQP 1.0 機能が含まれるリスト。 |
11.4. リンクプロパティー リンクのコピーリンクがクリップボードにコピーされました!
| オプション | 値 | セマンティクス |
|---|---|---|
reliability
|
現在
unreliable、およびのみサポートさ at-least-once れています。詳細は脚注を参照してください。
信頼性は、送信者またはレシーバーが要求するリンク信頼性のレベルを示し、
unreliable at-most-once 現在シノニムとして扱われます。また、ブローカーがクラッシュしたり、ブローカーへの接続が失われたりした場合にメッセージが失われるようにします。メッセージが失われる可能性はなく、at-least-once メッセージが失われていないことを exactly-once 保証します。メッセージが失われていないことを保証し、正確に配信されます。
| |
durable
|
:
True、の 1 つ False。
|
ブローカーが再起動した場合など、リンクが揮発性ストレージの損失後も存続するかどうかを示します。
|
x-declare
|
値が AMQP 0-10
queue-declare コマンドの有効なフィールドに対応するネストされたマップ。
|
これらの値は、交換からの受信時にサブスクリプションキューをカスタマイズするために使用できます。ただし、これはプロトコル固有であることに注意してください。
|
x-subscribe
|
値が AMQP 0-10
message-subscribe コマンドの有効なフィールドに対応するネストされたマップ。
|
これらの値は、サブスクリプションのカスタマイズに使用できます。
|
x-bindings
|
AMQP 0-10 バインディングを記述するフィールド(、
queue exchange、key および arguments)が含まれる可能性がある各エントリーのネストされたリスト。
|
これらのバインディングは、create オプションとは別に解決中に確立されます。それらは、ノードの作成ではなく、リンクプロセスの一部と見なされます。
|
filter
|
AMQP 1.0 フィルターが含まれる
name descriptor value、、およびが含まれるマップ。
| name
descriptor です。フィルタータイプを特定する文字列記述子です。value はフィルターのタイプで決まります(例: string legacy-amqp-direct-bindingおよび map for legacy-amqp-headers-binding)。 |
11.5. アドレス文字列グラフ リンクのコピーリンクがクリップボードにコピーされました!
トークン
以下の正規表現は、アドレス文字列の解析に使用されるトークンを定義します。
LBRACE: \\{
RBRACE: \\}
LBRACK: \\[
RBRACK: \\]
COLON: :
SEMI: ;
SLASH: /
COMMA: ,
NUMBER: [+-]?[0-9]*\\.?[0-9]+
ID: [a-zA-Z_](?:[a-zA-Z0-9_-]*[a-zA-Z0-9_])?
STRING: "(?:[^\\\\"]|\\\\.)*"|\'(?:[^\\\\\']|\\\\.)*\'
ESC: \\\\[^ux]|\\\\x[0-9a-fA-F][0-9a-fA-F]|\\\\u[0-9a-fA-F][0-9a-fA-F][0-9a-fA-F][0-9a-fA-F]
SYM: [.#*%@$^!+-]
WSPACE: [ \\n\\r\\t]+
文法
アドレスの正式な文法は以下のとおりです。
address := name [ SLASH subject ] [ ";" options ]
name := ( part | quoted )+
subject := ( part | quoted | SLASH )*
quoted := STRING / ESC
part := LBRACE / RBRACE / COLON / COMMA / NUMBER / ID / SYM
options := map
map := "{" ( keyval ( "," keyval )* )? "}"
keyval "= ID ":" value
value := NUMBER / STRING / ID / map / list
list := "[" ( value ( "," value )* )? "]"
アドレス文字列のオプション
アドレス文字列オプションマップでは、以下のパラメーターがサポートされます。
AMQP 0-10
<name> [ / <subject> ] ; {
create: always | sender | receiver | never,
delete: always | sender | receiver | never,
assert: always | sender | receiver | never,
mode: browse | consume,
node: {
type: queue | topic,
durable: True | False,
x-declare: { ... <declare-overrides> ... },
x-bindings: [<binding_1>, ... <binding_n>]
},
link: {
name: <link-name>,
durable: True | False,
reliability: unreliable | at-most-once | at-least-once | exactly-once,
x-declare: { ... <declare-overrides> ... },
x-bindings: [<binding_1>, ... <binding_n>],
x-subscribe: { ... <subscribe-overrides> ... }
}
}
AMQP 1.0
<name> [ / <subject> ] ; {
create: always | sender | receiver | never,
assert: always | sender | receiver | never,
mode: browse | consume,
node: {
type: queue | topic,
durable: True | False,
properties: { ... <nested-map> ... }[2],
capabilities: [<capability_1>, ... <capability_n>]
},
link: {
name: <link-name>,
durable: True | False,
reliability: unreliable | at-most-once | at-least-once | exactly-once,
filter: { name: <name>, descriptor: <filter-descriptor>, value: <filter-value> }
}
}
Create、Delete、および Assert ポリシー
( create delete AMQP 0-10 のみ)、および assert ポリシーは、関連するアクションを実行するユーザーを指定します。
- Always
- アクションはすべてのメッセージングクライアントによって実行されます。
- sender
- アクションは送信元によってのみ実行されます。
- receiver
- アクションはレシーバーによってのみ実行されます。
- Never
- アクションは実行されない(デフォルト)。
node-Type
は以下の node-type いずれかになります。
- トピック
- AMQP 0-10 マッピングでは、トピックノードはデフォルトでトピック交換に、x-declare を使用して他の交換タイプを指定できます。
- Queue
- これがデフォルトです。
node-type
フィルター記述子
以下の AMQP 1.0 フィルターは MRG 3 に実装されます。
legacy-amqp-direct-bindinglegacy-amqp-topic-bindinglegacy-amqp-headers-bindingselector-filterxquery-filter
properties nested map is recommended. The x-declare map is supported as a convenience and is automatically converted to a properties map before sending to the broker.
11.6. 接続オプション リンクのコピーリンクがクリップボードにコピーされました!
11.7. 接続オプションの設定 リンクのコピーリンクがクリップボードにコピーされました!
- python
connection = Connection("localhost:5672", reconnect = True, reconnect_urls = "amqp:tcp:127.0.0.1:5674", heartbeat = 1) try: connection.open()- C++
Connection connection("localhost:5672", "{reconnect: true, reconnect_urls:'amqp:tcp:127.0.0.1:5674', reconnect:true, heartbeat: 1}"); try { connection.open();- .NET/C#
Connection connection= new Connection("localhost:5672", "{reconnect: true, reconnect_urls:'amqp:tcp:127.0.0.1:5674', reconnect:true, heartbeat: 1}"); try { connection.Open();
- python
connection = Connection("localhost:5672") connection.reconnect = True try: connection.Open()- C++
Connection connection("localhost:5672"); connection.setOption("reconnect", true); try { connection.open();- .NET/C#
Connection connection = new Connection("localhost:5672"); connection.SetOption("reconnect", true); try { connection.Open();
11.8. 接続オプションのリファレンス リンクのコピーリンクがクリップボードにコピーされました!
| オプション名 | 値のタイプ | セマンティクス |
|---|---|---|
| username | string | ブローカーへの認証時に使用するユーザー名。 |
| password | string | ブローカーへの認証時に使用するパスワード。 |
| heartbeat | 整数 | ハートビートが N 秒ごとに送信される要求。連続するハートビートが 2 つ不足すると、接続は失われたと見なされ、失敗するか、再接続プロセスを開始する(設定されている場合)。 |
| max-channels | 整数 | Messaging API のチューニングを支援するために、サポートされているチャネルの最大数を制限します。AMPQ 1.0 ではサポートされません。 |
| max-frame-size | 整数 |
メッセージング API のチューニングに役立つ最大フレームサイズを制限します。AMPQ 1.0 ではサポートされません。
最小値は 4096B 以上で、小さいと認証に失敗します。このプロダクトは、この制限を適用しません。
|
| protocol | string | 使用する AMQP プロトコル。認識できる値は 'amqp1.0' およびamqp0-10' です。AMQP 0-10 がデフォルトです。注記: Python クライアントではサポートされません。 |
| reconnect | ブール値 | 接続が失われた場合は透過的に再接続します。 |
| reconnect_urls | ブローカーのアドレスリスト | 接続の失敗時に通信を試行する 1 つ以上のブローカーの一覧。 |
| reconnect_urls_replace | ブール値 | reconnect_urls オプションの処理方法を制御します。true の場合、設定 reconnect_urls により古いリストが新しいリストに置き換えられます。false の場合、新しいリストが古いリストに追加されます。デフォルト値は false です。 |
| reconnect_timeout | float | 断念して例外を発生させるまでの再接続試行を継続する合計秒数。 |
| reconnect_limit | 整数 | 例外を断念して発生するまでの再接続試行の最大数。 |
| reconnect_interval_min | float | 再接続試行までの最小秒数。最初の再接続試行は即座に行われます。失敗した場合は、最初の再接続遅延がの値に設定されます reconnect_interval_min。失敗した場合は、再接続の試行が成功または完了するまで、再接続間隔 reconnect_interval_max が指数関数的に増加します。この値は分数にすることができます。たとえば、0.001 は最大再接続間隔を 1 ミリ秒に設定します。 |
| reconnect_interval_max | float | 最大再接続間隔(秒単位)。この値は分数にすることができます。たとえば、0.001 は最大再接続間隔を 1 ミリ秒に設定します。 |
| reconnect_interval | float | reconnection_interval_min およびと reconnection_interval_max を同じ秒数に設定します。 |
| sasl_mechanisms | string | ブローカーに対して、スペースで区切られたリストとして認証する際に使用する特定の SASL メカニズム。 |
| sasl_service | string | 使用中の SASL メカニズムで必要な場合はサービス名。 |
| sasl_min_ssf | 整数 | 許容される最小のセキュリティー強度係数。 |
| sasl_max_ssf | 整数 | 許容できる最大セキュリティー強度係数。 |
| ssl_cert_name | string | 指定のクライアントに使用する証明書の名前。 |
| ssl_ignore_hostname_verification_failure | ブール値 | クライアントへのサーバーの認証を無効にします(最後の手段としてのみ使用してください)。true に設定すると、使用されるホスト名(または IP アドレス)がサーバー証明書にある内容と一致しない場合でも、クライアントはサーバー証明書に接続できます。 |
| tcp_nodelay | ブール値 | セット( tcp_no_delay例: Nagle アルゴリズムを無効にします)。注記: Python クライアントではサポートされません。 |
| transport | string | 使用されるトランスポートプロトコルを設定します。デフォルトのオプションはです tcp。ssl を有効にするには、に設定し sslます。C++ クライアントは、追加でサポートし rdmaます。 |
| オプション名 | 値のタイプ | セマンティクス |
|---|---|---|
| address_ttl | float | キャッシュされたアドレス解決の有効期限が切れるまでの時間。 |
| host | string | リモートホストの名前または ip アドレス(上書き url)。 |
| port | 整数 | リモートホストのポート番号(上書き url)。 |
| ssl_certfile | string | クライアントの公開鍵(PEM 形式)のあるファイル。 |
| ssl_keyfile | string | クライアントの秘密鍵(PEM 形式)のあるファイル。 |
| ssl_trustfile | string | サーバーを検証するための信頼された証明書が含まれるファイル。 |
| url | string | [ <username> [ / <password> ] @ ] <host> [ : <port> ]. |
| オプション名 | 値のタイプ | セマンティクス |
|---|---|---|
| container_id | string | 接続に使用するコンテナー ID。 |
| nest_annotations | ブール値 | true の場合、受信したメッセージのアノテーションはプロパティーとして示され、キー x-amqp-delivery-annotations または x-amqp-delivery-annotations が表示されます。値は、アノテーションを含むネストされたマップで構成されます。false の場合、アノテーションはプロパティーとマージされます。 |
| set_to_on_send | ブール値 | true の場合、送信されたすべてのメッセージでは、to フィールドに送信者のノード名が設定されます。 |
| properties または client_properties | 整数 | 送信された、開いているフレームに追加するプロパティー。 |
第12章 メッセージのタイムスタンプ リンクのコピーリンクがクリップボードにコピーされました!
12.1. メッセージのタイムスタンプ リンクのコピーリンクがクリップボードにコピーされました!
12.2. Broker Start-up でのメッセージのタイムスタンプの有効化 リンクのコピーリンクがクリップボードにコピーされました!
./qpidd --enable-timestamp yes
12.3. アプリケーションからのメッセージのタイムスタンプの有効化 リンクのコピーリンクがクリップボードにコピーされました!
- getTimestampConfig
- 受信したメッセージがタイムスタンプとなった
True場合に返されます。 - setTimestampConfig
- 受信
Trueしたメッセージのタイムスタンプを有効にするFalseには、タイムスタンプを無効にします。
12.4. Python のメッセージのタイムスタンプへのアクセス リンクのコピーリンクがクリップボードにコピーされました!
try:
msg = receiver.fetch(timeout=1)
if "x-amqp-0-10.timestamp" in msg.properties:
print("Timestamp=%s" % str(msg.properties["x-amqp-0-10.timestamp"]))
except Empty:
pass
12.5. C++ のメッセージのタイムスタンプへのアクセス リンクのコピーリンクがクリップボードにコピーされました!
messaging::Message msg;
if (receiver.fetch(msg, messaging::Duration::SECOND*1)) {
if (msg.getProperties().find("x-amqp-0-10.timestamp") !=
msg.getProperties().end()) {
std::cout << "Timestamp=" <<
msg.getProperties()["x-amqp-0-10.timestamp"].asString() << std::endl;
}
}
12.6. AMQ 0-10 メッセージプロパティーキーのタイムスタンプの使用 リンクのコピーリンクがクリップボードにコピーされました!
delivery-properties.timestamp)に設定されていると、x-amqp-0-10.timestamp message プロパティーを使用してタイムスタンプの値にアクセスできます。
関連項目
第13章 マップおよびリスト リンクのコピーリンクがクリップボードにコピーされました!
13.1. メッセージコンテンツ内のマップおよびリスト リンクのコピーリンクがクリップボードにコピーされました!
13.2. ネイティブデータタイプのマップおよび一覧表示 リンクのコピーリンクがクリップボードにコピーされました!
| 言語 | map | list |
|---|---|---|
| python | dict | list |
| C++ | Variant::Map | Variant::List |
| Java | MapMessage | ListMessage |
| .NET | Dictionary<string, object> | Collection<object> |
13.3. Python での Qpid マップおよびリスト リンクのコピーリンクがクリップボードにコピーされました!
- python
from qpid.messaging import * # !!! SNIP !!! content = {'Id' : 987654321, 'name' : 'Widget', 'percent' : 0.99} content['colours'] = ['red', 'green', 'white'] content['dimensions'] = {'length' : 10.2, 'width' : 5.1,'depth' : 2.0}; content['parts'] = [ [1,2,5], [8,2,5] ] content['specs'] = {'colors' : content['colours'], 'dimensions' : content['dimensions'], 'parts' : content['parts'] } message = Message(content=content) sender.send(message)
13.4. マップの Python データタイプ リンクのコピーリンクがクリップボードにコピーされました!
| Python データタイプ | → C++ | → Java |
|---|---|---|
| bool | bool | boolean |
| int | int64 | long |
| long | int64 | long |
| float | double | double |
| unicode | string | java.lang.String |
| uuid | qpid::types::Uuid | java.util.UUID |
| dict | Variant::Map | java.util.Map |
| list | Variant::List | java.util.List |
13.5. C++ の Qpid マップおよびリスト リンクのコピーリンクがクリップボードにコピーされました!
using namespace qpid::types;
// !!! SNIP !!!
Message message;
Variant::Map content;
content["id"] = 987654321;
content["name"] = "Widget";
content["percent"] = 0.99;
Variant::List colours;
colours.push_back(Variant("red"));
colours.push_back(Variant("green"));
colours.push_back(Variant("white"));
content["colours"] = colours;
Variant::Map dimensions;
dimensions["length"] = 10.2;
dimensions["width"] = 5.1;
dimensions["depth"] = 2.0;
content["dimensions"]= dimensions;
Variant::List part1;
part1.push_back(Variant(1));
part1.push_back(Variant(2));
part1.push_back(Variant(5));
Variant::List part2;
part2.push_back(Variant(8));
part2.push_back(Variant(2));
part2.push_back(Variant(5));
Variant::List parts;
parts.push_back(part1);
parts.push_back(part2);
content["parts"]= parts;
Variant::Map specs;
specs["colours"] = colours;
specs["dimensions"] = dimensions;
specs["parts"] = parts;
content["specs"] = specs;
message.setContentObject(content);
sender.send(message, true);
13.6. マップの C++ データタイプ リンクのコピーリンクがクリップボードにコピーされました!
| C++ Data Type | → Python | → Java |
|---|---|---|
| bool | bool | boolean |
| uint16 | int | long | short |
| uint32 | int | long | int |
| uint64 | int | long | long |
| int16 | int | long | short |
| int32 | int | long | int |
| int64 | int | long | long |
| float | float | float |
| double | float | double |
| string | unicode | java.lang.String |
| qpid::types::Uuid | uuid | java.util.UUID |
| Variant::Map | dict | java.util.Map |
| Variant::List | list | java.util.List |
13.7. .NET C# の Qpid マップおよびリスト リンクのコピーリンクがクリップボードにコピーされました!
- .NET/C#
using System; using System.Collections.Generic; using System.Collections.ObjectModel; using Org.Apache.Qpid.Messaging; namespace Org.Apache.Qpid.Messaging.examples { class MapSender { // csharp.map.sender example // // Send an amqp/map message // The map message contains simple types, a nested amqp/map, // an ampq/list, and specific instances of each supported type. // static int Main(string[] args) { string url = "amqp:tcp:localhost:5672"; string address = "message_queue; {create: always}"; string connectionOptions = ""; if (args.Length > 0) url = args[0]; if (args.Length > 1) address = args[1]; if (args.Length > 2) connectionOptions = args[2]; // // Create and open an AMQP connection to the broker URL // Connection connection = new Connection(url, connectionOptions); connection.Open(); // // Create a session and a sender // Session session = connection.CreateSession(); Sender sender = session.CreateSender(address); // // Create structured content for the message. This example builds a // map of items including a nested map and a list of values. // Dictionary<string, object> content = new Dictionary<string, object>(); Dictionary<string, object> subMap = new Dictionary<string, object>(); Collection<object> colors = new Collection<object>(); // add simple types content["id"] = 987654321; content["name"] = "Widget"; content["percent"] = 0.99; // add nested amqp/map subMap["name"] = "Smith"; subMap["number"] = 354; content["nestedMap"] = subMap; // add an amqp/list colors.Add("red"); colors.Add("green"); colors.Add("white"); // list contains null value colors.Add(null); content["colorsList"] = colors; // add one of each supported amqp data type bool mybool = true; content["mybool"] = mybool; byte mybyte = 4; content["mybyte"] = mybyte; UInt16 myUInt16 = 5 ; content["myUInt16"] = myUInt16; UInt32 myUInt32 = 6; content["myUInt32"] = myUInt32; UInt64 myUInt64 = 7; content["myUInt64"] = myUInt64; char mychar = 'h'; content["mychar"] = mychar; Int16 myInt16 = 9; content["myInt16"] = myInt16; Int32 myInt32 = 10; content["myInt32"] = myInt32; Int64 myInt64 = 11; content["myInt64"] = myInt64; Single mySingle = (Single)12.12; content["mySingle"] = mySingle; Double myDouble = 13.13; content["myDouble"] = myDouble; Guid myGuid = new Guid("000102030405060708090a0b0c0d0e0f"); content["myGuid"] = myGuid; content["myNull"] = null; // // Construct a message with the map content and send it synchronously // via the sender. // Message message = new Message(content); sender.Send(message, true); // // Wait until broker receives all messages. // session.Sync(); // // Close the connection. // connection.Close(); return 0; } } }
13.8. C# データタイプおよび.NET バインディング リンクのコピーリンクがクリップボードにコピーされました!
| C++ のデータタイプ | .NET バインディング |
|---|---|
| void | nullptr |
| bool | bool |
| uint8 | byte |
| uint16 | UInt16 |
| uint32 | UInt32 |
| uint64 | UInt64 |
| int16 | char |
| int16 | Int16 |
| int32 | Int32 |
| int64 | Int64 |
| float | Single |
| double | Double |
| string | string |
| qpid::types::Uuid | Guid |
| Variant::Map | Dictionary< string, object > |
| Variant::List | Collection< object > |
string オブジェクトは、UTF-8 エンコーディングのみを使用して C++ 文字列に変換されます。
第14章 要求/レスポンスパターン リンクのコピーリンクがクリップボードにコピーされました!
14.1. 要求/レスポンスパターン リンクのコピーリンクがクリップボードにコピーされました!
reply-to メッセージを送信したクライアントに応答できるようにします。サーバーは、クライアントが認識する名前でサービスキューを設定します。クライアントはサーバーの応答のプライベートキューを作成し、リクエストのメッセージを作成し、リクエストの respond-to プロパティーをクライアントの応答キューのアドレスに設定し、リクエストをサービスキューに送信します。サーバーは、リクエストの reply-to プロパティーで指定されたアドレスに応答を送信します。
14.2. リクエスト/レスポンス C++ の例 リンクのコピーリンクがクリップボードにコピーされました!
Receiver receiver = session.createReceiver("service_queue; {create: always}");
Message request = receiver.fetch();
const Address& address = request.getReplyTo(); // Get "reply-to" from request ...
if (address) {
Sender sender = session.createSender(address); // ... send response to "reply-to"
Message response("pong!");
sender.send(response);
session.acknowledge();
}
#、一意の名前が指定されます。
Sender sender = session.createSender("service_queue");
Receiver receiver = session.createReceiver("#response-queue; {create:always}");
Address responseQueue = receiver.getAddress();
Message request;
request.setReplyTo(responseQueue);
request.setContent("ping");
sender.send(request);
Message response = receiver.fetch();
std::cout << request.getContent() << " -> " << response.getContent() << std::endl;
第15章 パフォーマンスのヒント リンクのコピーリンクがクリップボードにコピーされました!
15.1. Apache Qpid プログラミングによるパフォーマンス リンクのコピーリンクがクリップボードにコピーされました!
- レシーバーのメッセージを事前フェッチすることを検討してください。これにより、ラウンドトリップがなくなり、スループットが向上します。prefetch はデフォルトで無効になっており、受信したメッセージのスループットを改善する最も効果的な方法です。
- メッセージを非同期に送信します。ここでも、これによりラウンドトリップが解消され、スループットが向上します。C++ および .NET クライアントはデフォルトで非同期的に送信しますが、python クライアントはデフォルトで同期送信を行います。
- バッチで確認応答します。メッセージごとに個別に承認するのではなく、メッセージや特定の期間が経過した後に確認応答を発行することを検討してください。
- 送信側の容量を調整します。容量が低い場合、送信側はより多くの容量を解放する前に、ブローカーがメッセージの受信を確認するためにブロックされる可能性があります。
- c++ クライアントが送信するメッセージに応答アドレスを設定する場合は、アドレスタイプが必要に応じて queue または topic に設定されていることを確認します。これにより、AMQP 0-10 で応答の処理時に必要となるノードの種類をクライアントが判断する必要がなくなりました。
- レイテンシーに敏感なアプリケーションの場合、クライアント接続の
tcp-nodelayオン qpidd および on を設定すると、レイテンシーを短縮できます。
第16章 クラスターフェイルオーバー リンクのコピーリンクがクリップボードにコピーされました!
16.1. MRG 3 でのクラスタリングの変更 リンクのコピーリンクがクリップボードにコピーされました!
cluster モジュールを新しい ha モジュールに置き換えます。このモジュールは、高可用性のためのアクティブ/パッシブクラスタリング機能を提供します。
cluster モジュールは active-active: クライアントはクラスターの任意のブローカーに接続できます。新しい ha モジュールはアクティブ/パッシブです。1 つのブローカーが プライマリー として動作し、他のブローカーは バックアップ として機能します。プライマリーのみがクライアント接続を許可します。クライアントがバックアップブローカーへの接続を試みると、接続は中止され、プライマリーに接続するまでクライアントは失敗します。
ha モジュールは、仮想 IP アドレス もサポートします。クライアントは、自動的にプライマリーブローカーにルーティングされる単一の IP アドレスで設定できます。これは推奨される設定です。
マルチスレッドパフォーマンスの向上
MRG 2 では、クラスター化されたブローカーは単一の CPU スレッドのみを使用します。一部のユーザーは、1 台のマシンで複数のクラスター化されたブローカーを実行して、複数のコアを利用することでこれを回避します。
16.2. アクティブ/パッシブメッセージングクラスター リンクのコピーリンクがクリップボードにコピーされました!
16.3. C++ でのクラスターフェイルオーバー リンクのコピーリンクがクリップボードにコピーされました!
reconnect を指定します。例:
qpid::messaging::Connection c("node1,node2,node3","{reconnect:true}");
heartbeat オプションを使用して接続のハートビート間隔(秒単位)を指定して有効にできます。例:
qpid::messaging::Connection c("node1,node2,node3","{reconnect:true,heartbeat:10}");
16.4. Python でのクラスターフェイルオーバー リンクのコピーリンクがクリップボードにコピーされました!
Connection.establish またはの呼び出し reconnect_urls 時のように host:port アドレスの reconnect=True 一覧を指定し Connection.openます。
connection = qpid.messaging.Connection.establish("node1", reconnect=True, reconnect_urls=["node1", "node2", "node3"])
heartbeat オプションを使用して接続のハートビート間隔(秒単位)を指定して有効にできます。例:
connection = qpid.messaging.Connection.establish("node1", reconnect=True, reconnect_urls=["node1", "node2", "node3"], heartbeat=10)
16.5. Java JMS クライアントでのフェイルオーバーの動作 リンクのコピーリンクがクリップボードにコピーされました!
failover プロパティーを使用して fail-over を使用するようにコネクションを設定できます。
connectionfactory.qpidConnectionfactory = amqp://guest:guest@clientid/test?brokerlist='tcp://localhost:5672'&failover='failover_exchange'
フェイルオーバーモード
failover_exchange- 接続に失敗した場合は、クラスター内の他のブローカーにフェイルオーバーします。これは、後方互換性を確保するために提供されます。仮想 IP(および透過的なサーバー側のフェイルオーバー)を使用することが推奨されます。
roundrobin- 接続に失敗した場合は、brokerlist に指定されたブローカーの 1 つにフェイルオーバーします。
singlebroker- フェイルオーバーはサポート対象外であり、接続は単一のブローカーのみに限定されます。
nofailover- すべての再試行およびフェイルオーバーロジックを無効にします。
<class>- 他の値は、
org.apache.qpid.jms.failover.FailoverMethodインターフェースを実装する必要があるクラス名として解釈されます。
idle_timeout プロパティーを使用して設定されます。これはハートビート期間に対応する整数(秒単位)です。たとえば、JNDI プロパティーファイルから以下の行はハートビートタイムアウトを 3 秒に設定します。
connectionfactory.qpidConnectionfactory = amqp://guest:guest@clientid/test?brokerlist='tcp://localhost:5672'&idle_timeout=3
第17章 logging リンクのコピーリンクがクリップボードにコピーされました!
17.1. C++ でのロギング リンクのコピーリンクがクリップボードにコピーされました!
- を使用 QPID_LOG_ENABLE して、対象のロギングレベルを設定します(、
tracedebuginfo、notice、、warning、error、またはcritical)。export QPID_LOG_ENABLE="warning+" - Qpidd ブローカーおよび C++ クライアントは、ロギング出力の送信先 QPID_LOG_OUTPUT を判断するために使用されます。これは、ファイル名または特別な値
stderrstdout、またはですsyslog。export QPID_LOG_TO_FILE="/tmp/myclient.out" - Windows コマンドプロンプトから、以下のコマンド形式を使用して環境変数を設定します。
set QPID_LOG_ENABLE=warning+ set QPID_LOG_TO_FILE=D:\tmp\myclient.out
17.2. Python でのロギング リンクのコピーリンクがクリップボードにコピーされました!
from logging import basicConfig
basicConfig()
from qpid.log import enable, DEBUG
enable("qpid.messaging.io", DEBUG)
17.3. ランタイム時のロギングレベルの変更 リンクのコピーリンクがクリップボードにコピーされました!
#include <qpid/messaging/Connection.h>
#include <qpid/messaging/Session.h>
#include <qpid/messaging/Sender.h>
#include <qpid/messaging/Receiver.h>
#include <qpid/messaging/Message.h>
#include <qpid/messaging/Address.h>
#include <iostream>
using namespace std;
using namespace qpid::messaging;
using namespace qpid::types;
int main(int argc, char** argv) {
if (argc < 2) {
cerr << "Invalid number of parameters, expecting log level (info, trace, warning or so)" << endl;
return 1;
}
string log_level = argv[1];
Connection connection(argc>2?argv[2]:"localhost:5672");
connection.open();
Session session = connection.createSession();
Sender sender = session.createSender("qmf.default.direct/broker");
Receiver receiver = session.createReceiver("#reply-queue; {create:always, node:{x-declare:{auto-delete:true}}}");
Address responseQueue = receiver.getAddress();
Message message;
Variant::Map content;
Variant::Map OID;
Variant::Map arguments;
OID["_object_name"] = "org.apache.qpid.broker:broker:amqp-broker";
arguments["level"] = log_level;
content["_object_id"] = OID;
content["_method_name"] = "setLogLevel";
content["_arguments"] = arguments;
message.setContentObject(content);
message.setReplyTo(responseQueue);
message.setProperty("x-amqp-0-10.app-id", "qmf2");
message.setProperty("qmf.opcode", "_method_request");
message.setContentType("amqp/map");
sender.send(message, true);
/* receive a response from the broker & check our request was successfully processed */
Message response;
if (receiver.fetch(response,qpid::messaging::Duration(30000)) == true) {
qpid::types::Variant::Map recv_props = response.getProperties();
if (recv_props["qmf.opcode"] == "_method_response")
std::cout << "Response: OK" << std::endl;
else if (recv_props["qmf.opcode"] == "_exception")
std::cerr << "Error: " << response.getContent() << std::endl;
else
std::cerr << "Invalid response received!" << std::endl;
}
else
std::cout << "Timeout: No response received within 30 seconds!" << std::endl;
receiver.close();
sender.close();
session.close();
connection.close();
return 0;
}
- サンプルコードをファイルに保存し
set_log_level.cppます。 - コードの Connection URL を変更して、ブローカーに解決します。この時点で、ローカルマシンの 5672 ポートで実行しているブローカーに接続するように設定されます。
- サンプルコードをコンパイルします。
g++ -Wall -lqpidclient -lqpidcommon -lqpidmessaging -lqpidtypes -o set_log_level set_log_level.cpp - 補完されたプログラムを使用して、ブローカーのログレベルを変更します。
./set_log_level "trace+" - ログレベルでの変更を確認するには、プログラムを実行するときにサーバーログを監視します。
第18章 security リンクのコピーリンクがクリップボードにコピーされました!
18.1. Qpid が提供するセキュリティー機能 リンクのコピーリンクがクリップボードにコピーされました!
18.2. 認証 リンクのコピーリンクがクリップボードにコピーされました!
18.3. Windows クライアントでの SASL サポート リンクのコピーリンクがクリップボードにコピーされました!
ANONYMOUS PLAIN および EXTERNAL 認証メカニズムのみをサポートします。
18.4. Kerberos 認証の有効化 リンクのコピーリンクがクリップボードにコピーされました!
connection.setOption("username", "mick");
connection.setOption("password", "pa$$word");
18.5. SSL の有効化 リンクのコピーリンクがクリップボードにコピーされました!
transport 接続オプション ssl:
connection.setOption("transport", "ssl");
18.6. C++ クライアント用の SSL クライアント環境変数 リンクのコピーリンクがクリップボードにコピーされました!
| C++ クライアントの SSL クライアントオプション | |
|---|---|
| QPID_SSL_USE_EXPORT_POLICY | NSS エクスポートポリシーの使用 |
| QPID_SSL_CERT_PASSWORD_FILE PATH | 証明書データベースへのアクセスに使用するパスワードを含むファイル |
| QPID_SSL_CERT_DB PATH | 証明書データベースが含まれるディレクトリーへのパス |
| QPID_SSL_CERT_NAME NAME | 使用する証明書の名前。SSL クライアント認証を有効にすると、通常、証明書名を指定する必要があります。 |
第19章 AMQP 0-10 マッピング リンクのコピーリンクがクリップボードにコピーされました!
19.1. AMQP 0-10 マッピング リンクのコピーリンクがクリップボードにコピーされました!
application-headers フィールドの qpid.subject エントリーとして追加され message-propertiesます。
message-subscribe リクエストを送信します。これ accept-mode は、リンクプロパティーの信頼性オプションにより決まります。信頼できないリンクの場合は、accept-mode は none で、信頼できるリンクは明示的なリンクです。キューのデフォルトは信頼性があります。acquire-mode は、mode オプションの値によって決定されます。モードが obtain モードの閲覧に設定されていると not-acquired、そのモードはに設定され pre-acquiredます。message-subscribe コマンドの exclusive および arguments フィールドは、x-subscribe マップを使用して制御できます。
x-declare マップを使用して指定できます。信頼性オプションは、他のほとんどのパラメーターを決定します。信頼性が unreliable 自動削除されると、排他的キューが使用されます。つまり、クライアントまたは接続でメッセージが失われる可能性があります。exactly-once キューは自動削除されるよう設定されていません。サブスクリプションキューの耐久性は、リンクプロパティーの永続オプションにより決まります。バインディングプロセスは、ソースアドレスが解決する交換のタイプによって異なります。
- トピック交換では、サブジェクトが指定されておらず、リンクに定義
x-bindingsされていない場合、サブスクリプションキューは任意のルーティングキーに一致するワイルドカードを使用してバインドされます(そのアドレスに送信されたメッセージはすべて受信されることが予想されます)。ソースアドレスでサブジェクトが指定されている場合には、バインディングキーに使用されます(つまり、ソースアドレスのサブジェクトがワイルドカードを含むバインディングパターンである可能性があることを意味します)。 - ジャンクアウト交換の場合、バインディングキーはマッチングとは関係ありません。エラーアウト交換に対して解決するソースアドレスから作成された受信側は、送信元アドレスに含まれるサブジェクトに関係なく、その交換に送信されたすべてのメッセージを受け取ります。引数をバインドに設定する必要がある場合は、リンクプロパティーの
x-bindings要素を使用する必要があります。 - 直接交換では、サブジェクトがバインディングキーとして使用されます。サブジェクトを指定しないと、空の文字列がバインディングキーとして使用されます。
- ヘッダー交換では、サブジェクトを指定しない
x-matchと、バインディング引数にエントリーが含まれ、他のエントリーも含まないため、すべてのメッセージが一致します。サブジェクトが指定されている場合、バインディング引数には all にx-match設定されたエントリーと、ソースアドレスのサブジェクトの値を qpid.subject 持つエントリーが含まれます(これは、ソースアドレスのサブジェクトがメッセージサブジェクトと一致する必要があることを意味します)。さらに制御するには、リンクプロパティーのx-bindings要素を使用する必要があります。 - XML の交換では、サブジェクトが指定されている場合はバインディングキーとして使用され、XQuery は、その値を持つメッセージに一致するものを定義し qpid.subjectます。この場合も、ソースアドレスで指定されたサブジェクトが正確に一致するメッセージのみが受信されます。サブジェクトが指定されていない場合、空の文字列は任意のメッセージに一致する xquery とともにバインディングキーとして使用されます(これは、ルーティングキーの受信として空の文字列を持つメッセージのみを受け取ることを意味します)。さらに制御するには、リンクプロパティーの x-bindings 要素を使用する必要があります。XML 交換に対して解決するソースアドレスには、ルーティングキーに関係なくメッセージを受信する方法がないため、リンクプロパティーの subject または x-bindings 要素が含まれている必要があります。
queue、、、、exchange keyまたはという名前を持つネストされたマップです arguments。キューの値がない場合は、キュー名にアドレスが解決され、暗黙的に解決されます。exchange の値がない場合は、アドレスが暗黙的に解決されます。
msg Qpid Messaging API で定義された Message クラスを参照します。mp AMQP 0-10 を参照します。 message-properties struct、および dp AMQP 0-10 を参照します。 delivery-properties 構造。
| Python API | C++ API [a] | AMQP 0-10 プロパティー [b] |
|---|---|---|
| msg.id | msg.{get,set}MessageId() | mp.message_id |
| msg.subject | msg.{get,set}Subject() | mp.application_headers ["qpid.subject"] |
| msg.user_id | msg.{get,set}UserId() | mp.user_id |
| msg.reply_to | msg.{get,set}ReplyTo() | mp.reply_to[c] |
| msg.correlation_id | msg.{get,set}CorrelationId() | mp.correlation_id |
| msg.durable | msg.{get,set}Durable() | dp.delivery_mode == delivery_mode.persistent[d] |
| msg.priority | msg.{get,set}Priority() | dp.priority |
| msg.ttl | msg.{get,set}Ttl() | dp.ttl |
| msg.redelivered | msg.{get,set}Redelivered() | dp.redelivered |
| msg.properties | msg.{get,set}Properties() | mp.application_headers |
| msg.content_type | msg.{get,set}ContentType() | mp.content_type |
[a]
C++ Messaging の .NET バインディングは、C++ API で説明されているメッセージおよび配信プロパティーをすべて提供します。
[c]
reply_to は、プロトコル表現からアドレスに変換されます。
[d]
msg.durable は列挙ではなくブール値であることに注意してください。
| ||
19.2. AMQ 0-10 メッセージプロパティーキー リンクのコピーリンクがクリップボードにコピーされました!
x-amqp-0-10.app-id、その値を使用して送信メッセージに message-properties.app-id プロパティーを設定します。同様に、受信メッセージが message-properties.app-id 設定されている場合は、メッセージプロパティーキーを使用してその値にアクセスでき x-amqp-0-10.app-id ます。
x-amqp-0-10.content-encoding、その値を使用して送信メッセージに message-properties.content-encoding プロパティーを設定します。同様に、受信メッセージが message-properties.content-encoding 設定されている場合は、メッセージプロパティーキーを使用してその値にアクセスでき x-amqp-0-10.content-encoding ます。
delivery-properties.routing-key)は、x-amqp-0-10.routing-key message プロパティーを介してアクセスできます。
19.3. AMQP ルーティングキーおよびメッセージサブジェクト リンクのコピーリンクがクリップボードにコピーされました!
x-amqp-0-10.routing-key プロパティーはメッセージサブジェクトの値に設定されますが、1 つの例外があります。
sender = session.sender('amq.topic/SubjectX')
msg1 = Message('A message with no subject')
msg2 = Message('A message with a subject')
msg2.subject = 'SubjectY'
msg1 AMQP ルーティングキーは ' ' に設定されており、そのサブジェクトSubjectX'SubjectY' を msg2 保持し、AMQP ルーティングキーが 'SubjectY' に設定されています。
sender = session('amq.topic')
msg = Message('No subject, and none assigned by the sender')
sender.send(msg)
sender = session('amq.topic')
msg = Message('No subject, but a manually assigned AMQP routing key')
msg.properties['x-amqp-0-10.routing-key'] = 'amqp-SubjectX'
sender.send(msg)
amqp-0-10.routing-key 場合がありますが、Red Hat Enterprise Messaging では、メッセージのルーティングに使用 subject されます。
import sys
from qpid.messaging import *
# This program demonstrates that the x-amqp-0-10.routing-key
# (1) is (re)set to the message subject when the message has a subject or
# is sent via a sender that has a subject
# (2) is not a valid basis for routing in a topic exchange
# - the topic exchange will not route a message to a queue
def sendmsg(msg, note = ''):
global rxplain, rxsubject, txplain, txsubject, ssn, testcount
msg.properties['sender'] = 'Plain Sender'
txplain.send(msg)
msg.properties['sender'] = 'SubjectX Sender'
txsubject.send(msg)
if testcount > 0:
x = raw_input('\nPress Enter for the next test message')
print '\n================================================\n'
testcount = testcount + 1
print '\nScenario ' + str(testcount)
print '\nSent message:\n'
subject = 'Blank'
if msg.subject:
subject = msg.subject
print 'Subject:\t' + subject
routekey = 'Blank'
if 'x-amqp-0-10.routing-key' in msg.properties:
routekey = msg.properties['x-amqp-0-10.routing-key']
print 'Routing Key:\t' + routekey
msgcount = 0
print '\nThe queue listening for all messages received:'
try:
while True:
rxmsg = rxplain.fetch(timeout = 1)
subject ='Blank'
if rxmsg.subject:
subject = rxmsg.subject
routekey = 'Blank'
if 'x-amqp-0-10.routing-key' in rxmsg.properties:
routekey = rxmsg.properties['x-amqp-0-10.routing-key']
print '\nSubject:\t' + subject
print 'Routing Key:\t' + routekey
print 'Sent via:\t' + rxmsg.properties['sender']
msgcount = 1
ssn.acknowledge(rxmsg)
except:
pass
if msgcount == 0:
print 'Nothing\n'
else:
msgcount = 0
print '\nThe queue listening for SubjectX messages received:'
try:
while True:
rxmsg = rxsubject.fetch(timeout = 1)
subject ='Blank'
if rxmsg.subject:
subject = rxmsg.subject
routekey = 'Blank'
if 'x-amqp-0-10.routing-key' in rxmsg.properties:
routekey = rxmsg.properties['x-amqp-0-10.routing-key']
print '\nSubject:\t' + subject
print 'Routing Key:\t' + routekey
print 'Sent via:\t' + rxmsg.properties['sender']
msgcount = 1
ssn.acknowledge(rxmsg)
except:
pass
if msgcount == 0:
print 'Nothing\n'
if note != '':
print '\nNote: ' + note + "\n"
connection = Connection("localhost:5672")
connection.open()
try:
ssn = connection.session()
# we create our receivers here so that queues are created to hold the messages sent
rxplain = ssn.receiver("amq.topic")
rxsubject = ssn.receiver("amq.topic/SubjectX")
txplain = ssn.sender("amq.topic")
txsubject = ssn.sender("amq.topic/SubjectX")
testcount = 0
msg = Message("Plain message, no subject")
sendmsg(msg, "a subject sender writes the subject and routing key when a message has no subject, a plain sender does not")
msg = Message("Message with subject")
msg.subject = "SubjectX"
sendmsg(msg, "a plain sender writes the routing key if the message has a subject")
msg = Message("Message with a different subject")
msg.subject = "SubjectY"
sendmsg(msg, "a subject sender does not rewrite a subject, both senders use the message subject to write routing key")
msg = Message("Message with routing key")
msg.properties["x-amqp-0-10.routing-key"] = "SubjectX"
sendmsg(msg, "a routing key is not sufficient to route to a queue - the match is on subject")
msg = Message("Message with different routing key")
msg.properties["x-amqp-0-10.routing-key"] = "SubjectY"
sendmsg(msg, "the only case where you can manually set a non-blank routing key is a message with a blank subject, sent via a plain sender")
msg = Message("Message with different routing key and subject")
msg.properties["x-amqp-0-10.routing-key"] = "SubjectY"
msg.subject = "SubjectZ"
sendmsg(msg, "all messages with subjects and all messages sent via a subject sender have their routing key rewritten")
finally:
connection.close()
19.4. AMQ 0-10 メッセージプロパティーキーのタイムスタンプの使用 リンクのコピーリンクがクリップボードにコピーされました!
delivery-properties.timestamp)に設定されていると、x-amqp-0-10.timestamp message プロパティーを使用してタイムスタンプの値にアクセスできます。
関連項目
第20章 qpid-java AMQP 0-10 クライアントの使用 リンクのコピーリンクがクリップボードにコピーされました!
20.1. Java JMS における簡単なメッセージングプログラム リンクのコピーリンクがクリップボードにコピーされました!
package org.apache.qpid.example.jmsexample.hello;
import javax.jms.*;
import javax.naming.Context;
import javax.naming.InitialContext;
import java.util.Properties;
public class Hello {
public Hello() {
}
public static void main(String[] args) {
Hello producer = new Hello();
producer.runTest();
}
private void runTest() {
try {
Properties properties = new Properties();
properties.load(this.getClass().getResourceAsStream("hello.properties"));
Context context = new InitialContext(properties);
ConnectionFactory connectionFactory
= (ConnectionFactory) context.lookup("qpidConnectionfactory");
Connection connection = connectionFactory.createConnection();
connection.start();
Session session=connection.createSession(false,Session.AUTO_ACKNOWLEDGE);
Destination destination = (Destination) context.lookup("topicExchange");
MessageProducer messageProducer = session.createProducer(destination);
MessageConsumer messageConsumer = session.createConsumer(destination);
TextMessage message = session.createTextMessage("Hello world!");
messageProducer.send(message);
message = (TextMessage)messageConsumer.receive();
System.out.println(message.getText());
connection.close();
context.close();
}
catch (Exception exp) {
exp.printStackTrace();
}
}
}
説明
以下は、プログラムコードの説明です。
properties.load(this.getClass().getResourceAsStream("hello.properties"));
Context context = new InitialContext(properties);
ConnectionFactory connectionFactory
= (ConnectionFactory) context.lookup("qpidConnectionfactory");
Connection connection = connectionFactory.createConnection();
connection.start();
Session session=connection.createSession(false,Session.AUTO_ACKNOWLEDGE);
Destination destination = (Destination) context.lookup("topicExchange");
MessageProducer messageProducer = session.createProducer(destination);
MessageConsumer messageConsumer = session.createConsumer(destination);
message = (TextMessage)messageConsumer.receive();
connection.close();
context.close();
hello.properties file
hello.properties ファイルの内容は以下のとおりです。
java.naming.factory.initial
= org.apache.qpid.jndi.PropertiesFileInitialContextFactory
# connectionfactory.[jndiname] = [ConnectionURL]
connectionfactory.qpidConnectionfactory
= amqp://guest:guest@clientid/test?brokerlist='tcp://localhost:5672'
# destination.[jndiname] = [address_string]
destination.topicExchange = amq.topic
20.2. AMQP Messaging の Apache Qpid JNDI プロパティー リンクのコピーリンクがクリップボードにコピーされました!
- connectionfactory.<jndiname>
- 接続ファクトリーが接続を実行するために使用する Connection URL。
- queue.<jndiname>
- JMS キュー。Apache Qpid で
amq.direct交換として実装されます。 - topic.<jndiname>
- JMS トピック。Apache Qpid で
amq.topic交換として実装されます。 - destination.<jndiname>
- アドレス文字列(または、以前の実装と後方互換性のためにバインディング URL)を使用して、amq 宛先、キュー、トピック、およびヘッダーの照合をすべて定義するために使用できます。
20.3. Apache Qpid の JNDI プロパティー リンクのコピーリンクがクリップボードにコピーされました!
java.naming.factory.initial
= org.apache.qpid.jndi.PropertiesFileInitialContextFactory
# connectionfactory.[jndiname] = [ConnectionURL]
connectionfactory.qpidConnectionfactory
= amqp://guest:guest@clientid/test?brokerlist='tcp://localhost:5672'
# destination.[jndiname] = [address_string]
destination.topicExchange = amq.topic
20.4. MRG 3 での永続的サブスクリプションキュー リンクのコピーリンクがクリップボードにコピーされました!
# java -cp ${CLASSPATH} org.apache.qpid.example.Drain "amq.topic/some_subject;{ link: { durable: true } }"
javax.jms.JMSException: Error registering consumer: org.apache.qpid.AMQException: You cannot mark a subscription queue as durable without providing a name for the link.
# java -cp ${CLASSPATH} org.apache.qpid.example.Drain "amq.topic/some_subject;{ link: { name: some_name, durable: true } }"
20.5. 接続 URL リンクのコピーリンクがクリップボードにコピーされました!
amqp://[<user>:<pass>@][<clientid>]<virtualhost>[?<option>='<value>'[&<option>='<value>']]
amqp://username:password@clientid/test?brokerlist='tcp://localhost:5672'
| オプション | type | description |
|---|---|---|
brokerlist
|
このコネクションに使用するブローカー。現在のリリースでは、正確に 1 つのブローカーを指定する必要があります。
| |
max_prefetch
|
整数
|
宛先ごとの事前にフェッチされたメッセージの最大数。
|
sync_publish
|
{'persistent' | 'transient' | 'all' | ''}
|
sync コマンドは、永続メッセージまたは一時的なメッセージが毎回送信され、受信が確実に行われます。
persistent 永続メッセージに対してこの動作を設定します。
transient この動作を一時的なメッセージのみに設定します。
all 両方のタイプのメッセージを同期しますが、デフォルトの動作 '' も同じ効果を持ちます。
|
sync_ack
|
ブール値
|
sync コマンドは、受信を確認するために毎回承認後に送信されます。
|
use_legacy_map_msg_format
|
ブール値
|
JMS Map メッセージを使用し、0.7 リリースよりも古い JMS クライアントで新しいクライアントをデプロイする場合、これを設定して古いクライアントがマップメッセージエンコーディング
true を把握できるようにする必要があります。
|
failover
| {'roundrobin' | 'failover_exchange' | 'singlebroker' | 'nofailover' | '<class>'}
|
|
ssl |
ブール値
|
すべてのブローカー接続に SSL
ssl='true'を使用します。brokerlist エントリーのブローカーごとの設定をオーバーライドします。指定されていない場合、指定した各ブローカーの brokerlist エントリーを使用して、SSL が使用されるかどうかを判断します。
|
ブローカーリスト URL
brokerlist=<transport>://<host>[:<port>](?<param>=<value>)?(&<param>=<value>)*
brokerlist='tcp://localhost:5672'
例20.1 ブローカーリスト
amqp://guest:guest@test/test?sync_ack='true'
&brokerlist='tcp://ip1:5672?sasl_mechs='GSSAPI''
amqp://guest:guest@test/test?sync_ack='true'
&brokerlist='tcp://ip1:5672?ssl='true'&ssl_cert_alias='cert1''
amqp://guest:guest@/test?failover='roundrobin?cyclecount='2''
&brokerlist='tcp://ip1:5672?retries='5'&connectdelay='2000';tcp://ip2:5672?retries='5'&connectdelay='2000''
| オプション | type | description |
|---|---|---|
idle_timeout
|
整数
|
idle_timeout メッセージの頻度(秒単位)
|
sasl_mechs
|
--
|
セキュアなアプリケーションの場合、提案
CRAM-MD5 DIGEST-MD5、またはです GSSAPI。この ANONYMOUS メソッドは安全ではありません。この PLAIN 方法は、SSL と併用した場合に限り安全です。Kerberos を設定 sasl_mechs するに GSSAPI sasl_protocol は、qpidd ブローカーのプリンシパル(例:)を設定し qpidd/、SASL サーバーのホスト(例:)に設定 sasl_server する必要があります sasl.com。SASL External は SSL 認定を使用してサポートされます(例:)。 ssl='true'&sasl_mechs='EXTERNAL'
|
sasl_encryption
|
ブール値
|
if
sasl_encryption='true'、JMS クライアントは、GSSAPI を使用して接続を暗号化するためにブローカーでセキュリティー層をネゴシエートしようとします。これを行うには、GSSAPI がとして選択される必要があることに注意してください sasl_mech。
|
ssl
|
ブール値
|
if
ssl='true' の場合、JMS クライアントは SSL を使用して接続を暗号化します。
|
tcp_nodelay
|
ブール値
|
if
tcp_nodelay='true' の場合、TCP パケットのバッチ処理が無効になります。
|
sasl_protocol
|
--
|
Kerberos にのみ使用されます。たとえば、qpidd ブローカーのプリンシパルに設定
sasl_protocol する必要があります。 qpidd/
|
sasl_server
|
--
|
Kerberos を設定
sasl_mechs するには GSSAPI、に SASL サーバーのホストを設定 sasl_server する必要があります(例:) sasl.com。
|
trust_store
|
string
|
Kerberos トラストストアへのパス
|
trust_store_password
|
string
|
Kerberos トラストストアのパスワード
|
key_store
|
string
|
Kerberos キーストアへのパス
|
key_store_password
|
string
|
Kerberos キーストアのパスワード
|
ssl_verify_hostname
|
ブール値
|
SSL を使用する場合、ブローカー URL の "=" を使用してホスト名の検証を有効
ssl_verify_hostnametrueにできます。
|
ssl_cert_alias
|
string
|
複数の証明書がキーストアにある場合、エイリアスを使用して正しい証明書を抽出します。
|
retries | 整数 |
Broker リストの各ブローカーへの接続を再試行する回数。デフォルトは 1 です。
|
connectdelay | 整数 |
再接続を試みるまで待機する時間(ミリ秒単位)。デフォルトは 0 です。
|
connecttimeout | 整数 |
ソケット接続が正常に実行されるまで待機する時間(ミリ秒単位)。値が 0 の場合は無限のタイムアウトを表します。つまり、接続の試行は確立されるまでブロックするか、エラーが発生します。デフォルトは 30000 です。
|
tcp_nodelay | ブール値 | TCP パケット tcp_nodelay='true'のバッチ処理が無効になっている場合。Qpid 0.14 以降、デフォルトで true に設定されます。 |
20.6. Java JMS メッセージプロパティー リンクのコピーリンクがクリップボードにコピーされました!
| JMS ヘッダー名 | AMQP Identifier | AMQP フィールド | AMQP Section | 注記 |
|---|---|---|---|---|
JMSCorrelationID | correlation_id
| correlation-id
| properties | |
JMSDeliveryMode | delivery_mode
| durable
| header | 計算された値: [durable ? 'PERSISTENT' : 'NON_PERSISTENT'] |
JMSDestination | to
| to
| properties | |
JMSExpiration | absolute_expiry_time
| absolute-expiry-time
| properties | |
JMSMessageID | message_id
| message-id
| properties | |
JMSPriority | priority
| priority
| header | |
JMSRedelivered | redelivered
| delivery-count
| header | 計算値: delivery-count> 0 |
JMSReplyTo | reply_to
| reply-to
| properties | |
JMSTimestamp | creation_time
| creation-time
| properties | |
JMSType | subject
| subject
| properties |
JMSDeliveryModeJMSPriorityJMSMessageIDJMSTimestampJMSCorrelationIDJMSType
20.7. JMS MapMessage タイプ リンクのコピーリンクがクリップボードにコピーされました!
例20.2 Java JMS MapMessage の送信
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import javax.jms.Connection;
import javax.jms.Destination;
import javax.jms.MapMessage;
import javax.jms.MessageProducer;
import javax.jms.Session;
import org.apache.qpid.client.AMQAnyDestination;
import org.apache.qpid.client.AMQConnection;
import edu.emory.mathcs.backport.java.util.Arrays;
// !!! SNIP !!!
MessageProducer producer = session.createProducer(queue);
MapMessage m = session.createMapMessage();
m.setIntProperty("Id", 987654321);
m.setStringProperty("name", "Widget");
m.setDoubleProperty("price", 0.99);
List<String> colors = new ArrayList<String>();
colors.add("red");
colors.add("green");
colors.add("white");
m.setObject("colours", colors);
Map<String,Double> dimensions = new HashMap<String,Double>();
dimensions.put("length",10.2);
dimensions.put("width",5.1);
dimensions.put("depth",2.0);
m.setObject("dimensions",dimensions);
List<List<Integer>> parts = new ArrayList<List<Integer>>();
parts.add(Arrays.asList(new Integer[] {1,2,5}));
parts.add(Arrays.asList(new Integer[] {8,2,5}));
m.setObject("parts", parts);
Map<String,Object> specs = new HashMap<String,Object>();
specs.put("colours", colors);
specs.put("dimensions", dimensions);
specs.put("parts", parts);
m.setObject("specs",specs);
producer.send(m);
MapMessageおよび、Python または C++ でクライアントが受信する対応するデータタイプ。
| Java Data Type | ? Python | ? C++ |
|---|---|---|
| boolean | bool | bool |
| short | int | long | int16 |
| int | int | long | int32 |
| long | int | long | int64 |
| float | float | float |
| double | float | double |
| java.lang.String | unicode | std::string |
| java.util.UUID | uuid | qpid::types::Uuid |
| java.util.Map[a] | dict | Variant::Map |
| java.util.List | list | Variant::List |
[a]
Qpid では、マップはネストできます。これは、JMS 仕様で必要な機能を超えています。
| ||
20.8. JMS ListMessage リンクのコピーリンクがクリップボードにコピーされました!
ListMessage タイプはリストの送信に利用できます。
javax.jms.StreamMessagejavax.jms.MapMessageorg.apache.qpid.jms.ListMessage
org.apache.qpid.jms.ListMessage- でこれを作成createListMessage()しorg.apache.qpid.jms.Sessionます。例:ListMessage msg = ((org.apache.qpid.jms.Session)ssn).createListMessage();- 作成
-Dqpid.use_legacy_stream_message=falseするストリームメッセージを設定すると、リストメッセージとしてエンコードされます。例:StreamMessage msg = jmsSession.createStreamMessage();
20.9. JMS クライアントロギング リンクのコピーリンクがクリップボードにコピーされました!
DEBUG で、ログ過剰によりパフォーマンスが大幅に低下します。実稼働環境で推奨されるロギングレベルはです WARN。
log4j.properties ファイルに配置して配置することも CLASSPATH、-Dlog4j.configuration プロパティーを使用して明示的に設定できます。
例20.3 Log4j ロギングプロパティー
log4j.logger.org.apache.qpid=WARN, console
log4j.additivity.org.apache.qpid=false
log4j.appender.console=org.apache.log4j.ConsoleAppender
log4j.appender.console.Threshold=all
log4j.appender.console.layout=org.apache.log4j.PatternLayout
log4j.appender.console.layout.ConversionPattern=%t %d %p [%c{4}] %m%n
20.10. AMQP 0-10 JMS クライアントの設定 リンクのコピーリンクがクリップボードにコピーされました!
20.10.1. 設定方法および粒度 リンクのコピーリンクがクリップボードにコピーされました!
- JVM 引数を使用した JVM レベル: JVM 内で作成されたすべての接続、セッション、コンシューマー、およびプロデューサーに影響します。例: -dmax_prefetch=1000 プロパティーは、使用するメッセージのクレジットを指定します。
- 接続またはブローカープロパティーを使用した接続レベル: その接続によって作成された各接続およびセッション、コンシューマー、プロデューサーに影響します。例: amqp://guest:guest@test/test?max_prefetch='1000' &brokerlist='tcp://localhost:5672' プロパティーは、使用するメッセージのクレジットを指定します。これにより、JVM 引数で指定したすべての値が上書きされ max_prefetchます。
- アドレス指定オプションを使用した宛先レベル: 各宛先を使用して作成されたプロデューサーとコンシューマーに影響します。例: capacity オプション my-queue; {create: always, link:{capacity: 10}} は、使用するメッセージのクレジットを指定します。これにより、接続レベルの設定が上書きされます。
20.10.2. qpid-java JVM 引数 リンクのコピーリンクがクリップボードにコピーされました!
| プロパティー名 | type | デフォルト値 | description |
|---|---|---|---|
qpid.amqp.version | string | 0-10 | 使用される AMQP バージョンを設定します。現在 0-8、0-9、0-91、および 0-10 をサポートします。クライアントは指定されたバージョンでネゴシエーションを開始し、ブローカーが指定のバージョンに対応していない場合のみ、ダウンスケールをネゴシエートします。 |
qpid.heartbeat | int | 120(秒) | ハートビートの間隔(秒単位)。連続しない 2 つのハートビートにより、接続がタイムアウトします。これは、接続ごとに設定することもできます。 |
ignore_setclientID | ブール値 | false | クライアント ID が接続 URL で指定された場合、そのクライアント ID が使用され、使用されない場合は ID が生成されます。ID が生成された Qpid 後に指定された場合は、例外が発生します。このプロパティーを 'true' に設定するとチェックを無効にし、クライアント ID をいつでも設定できます。 |
| プロパティー名 | type | デフォルト値 | description |
|---|---|---|---|
qpid.session.command_limit | int | 65536 | 承認されていないコマンドの数を制限します。 |
qpid.session.byte_limit | int | 1048576 | 承認されていないコマンドの数をバイト単位で制限します。 |
qpid.use_legacy_map_message | ブール値 | false | 古いマップメッセージエンコーディングを使用します。デフォルトでは、マップメッセージは 0-10 マップエンコーディングを使用してエンコードされます。これは、接続ごとに設定することもできます。 |
qpid.jms.daemon.dispatcher | ブール値 | false | セッションディスパッチャースレッドがデーモンスレッドかどうかを制御します。このシステムプロパティーを true に設定すると、セッションディスパッチャースレッドがデーモンスレッドとして作成されます。この設定はバージョン 0.16 で導入されています。 |
| プロパティー名 | type | デフォルト値 | description |
|---|---|---|---|
max_prefetch | int | 500 | クレジットに対するメッセージの最大数。接続ごとや送信先ごとに設定することもできます。 |
qpid.session.max_ack_delay | long | 1000 (ms) | AUTO_ACK およびを使用する際にバッファーでメッセージをフラッシュするタイマー間隔 DUPS_OK。 |
sync_ack | ブール値 | false | 設定した場合、各メッセージは同期的に承認されます。AUTO_ACK mode を使用する場合は、これを「true」に設定します。接続ごとに設定することもできます。 |
| プロパティー名 | type | デフォルト値 | description |
|---|---|---|---|
sync_publish | string | - | メッセージを同期的に送信します。有効な値は persistent、、transient、です all。接続ごとに設定することもできます。 |
| プロパティー名 | type | デフォルト値 | description |
|---|---|---|---|
qpid.thread_factory | string | org.apache.qpid.thread.DefaultThreadFactory | 使用するスレッドファクトリーを指定します。リアルタイム JVM を使用する場合は、に設定し org.apache.qpid.thread.RealtimeThreadFactoryます。 |
qpid.rt_thread_priority | int | 20 | リアルタイムスレッドファクトリーによって作成されたリアルタイムスレッドの優先度(1-99)を指定します。 |
| プロパティー名 | type | デフォルト値 | description |
|---|---|---|---|
qpid.transport | string | org.apache.qpid.transport.network.io.IoNetworkTransport | 使用するトランスポートの実装。org.apache.qpid.transport.network.NetworkTransport トランスポートメカニズムを指定することもできます。 |
qpid.sync_op_timeout | long | 60000(ミリ秒) | 同期操作が完了するまで待機する時間。古いクライアントとの互換性を維持するには、を使用し amqj.default_syncwrite_timeoutます。 |
qpid.tcp_nodelay | ブール値 | true |
基盤のソケットの TCP_NODELAY プロパティーを設定します。
これは、Connection URL オプションを使用して接続ごとに設定することもできます。
古いクライアントとの互換性のために、シノニム
amqj.tcp_nodelay がサポートされます。
|
qpid.send_buffer_size | 整数 | 65535 |
基盤のソケットの SO_SNDBUF プロパティーを設定します。
古いクライアントとの互換性のために、シノニム
amqj.sendBufferSize がサポートされます。
|
qpid.receive_buffer_size | 整数 | 65535 |
基盤のソケットの SO_RCVBUF プロパティーを設定します。
古いクライアントとの互換性のために、シノニム
amqj.receiveBufferSize がサポートされます。
|
qpid.failover_method_timeout | long | 60000 |
フェイルオーバー中は、接続の再確立を試みる各試行のタイムアウトとなります。再接続の試行がタイムアウトを超えると、フェイルオーバープロセス全体が中止されます。
AMQP 0-8/0-9/0-9-1 クライアントにのみ適用されます。
|
| プロパティー名 | type | デフォルト値 | description |
|---|---|---|---|
qpid.sasl_mechs | string | PLAIN | 使用される SASL メカニズム。複数の場合はコンマで区切って指定できます。サポートされる値は PLAIN、GSSAPI、および EXTERNAL です。 |
qpid.sasl_protocol | string | AMQP | GSSAPI を SASL メカニズムとして使用する場合は、qpidd ブローカーのプリンシパルに設定する sasl_protocol 必要があります。 |
qpid.sasl_server_name | string | localhost | GSSAPI を SASL メカニズムとして使用する場合は、SASL サーバーのホストに設定する sasl_server 必要があります。 |
| プロパティー名 | type | デフォルト値 | description |
|---|---|---|---|
javax.security.auth.useSubjectCredsOnly | ブール値 | true | 'false' に設定すると、SASL GASSPI クライアントが kerberos 認証情報を明示的に取得するよう強制します。 |
java.security.auth.login.config | string | - | JASS 設定ファイルを指定します。 |
| プロパティー名 | type | デフォルト値 | description |
|---|---|---|---|
qpid.ssl_timeout | long | 60000 | 操作の待機時に Java SSL エンジンによって使用されるタイムアウト値。 |
qpid.ssl.KeyManagerFactory.algorithm | string | - |
キーマネージャーファクトリーアルゴリズム名。設定されていない場合、デフォルトで Java ランタイム呼び出し KeyManagerFactory.getDefaultAlgorithm()から返された値に設定されます。
古いクライアントとの互換性を維持するために、同じ名前 qpid.ssl.keyStoreCertType がサポートされます。
|
qpid.ssl.TrustManagerFactory.algorithm | string | - |
トラストマネージャーファクトリーアルゴリズム名。設定されていない場合、デフォルト値は Java ランタイム呼び出し TrustManagerFactory.getDefaultAlgorithm()から返された値に設定されます。
古いクライアントとの互換性を維持するために、同じ名前 qpid.ssl.trustStoreCertType がサポートされます。
|
| プロパティー名 | type | デフォルト値 | description |
|---|---|---|---|
javax.net.ssl.keyStore | string | JVM のデフォルト | キーストアパスを指定します。 |
javax.net.ssl.keyStorePassword | string | JVM のデフォルト | キーストアのパスワードを指定します。 |
javax.net.ssl.trustStore | string | JVM のデフォルト | トラストストアパスを指定します。 |
javax.net.ssl.trustStorePassword | string | JVM のデフォルト | トラストストアのパスワードを指定します。 |
20.11. Java Message Service with Filters リンクのコピーリンクがクリップボードにコピーされました!
20.11.1. No Local filter(ローカルフィルターなし) リンクのコピーリンクがクリップボードにコピーされました!
<type name="no-local-filter" class="composite" source="list" provides="filter">
<descriptor name="apache.org:no-local-filter:list" code="0x0000468C:0x00000003"/>
</type>
20.11.2. セレクターフィルター リンクのコピーリンクがクリップボードにコピーされました!
<type name="selector-filter" class="restricted" source="string" provides="filter">
<descriptor name="apache.org:selector-filter:string" code="0x0000468C:0x00000004"/>
</type>
field_name は上記のテーブルで名前 amqp.field_name が付けられた AMQP 1.0 フィールドで、ハイフンがアンダースコアに置き換えられます。たとえば、セレクター: は以下のようにネットワーク経由で JMSCorrelationID = 'abc' AND color = 'blue' AND weight > 2500 転送されます。 amqp.correlation_id = 'abc' AND color = 'blue' AND weight > 2500
| AMQP タイプ | JMS セレクタータイプ |
|---|---|
|
null
|
null
|
|
ブール値
|
ブール値
|
|
ubyte
|
short
|
|
ushort
|
int
|
|
uint
|
long
|
|
ulong
|
long
|
|
byte
|
byte
|
|
short
|
short
|
|
int
|
int
|
|
long
|
long
|
|
float
|
float
|
|
double
|
double
|
|
decimal32
|
double
|
|
decimal64
|
double
|
|
decimal128
|
double
|
|
char
|
char
|
|
timestamp
|
long
|
|
uuid
|
byte[16]
|
|
バイナリー
|
byte[]
|
|
string
|
string
|
|
記号
|
string
|
第21章 qpid-jms AMQP 1.0 クライアントの使用 リンクのコピーリンクがクリップボードにコピーされました!
21.1. QPID AMQP 1.0 JMS クライアント設定 リンクのコピーリンクがクリップボードにコピーされました!
InitialContext構文、定義時に設定できるさまざまな URI オプションなど、qpid-jms クライアントのさまざまな設定オプションについて説明し ConnectionFactoryます。
InitialContext、JNDI から取得した自体を使用して InitialContextFactory、のような JMS オブジェクトを検索し ConnectionFactoryます。Qpid JMS クライアントは、org.apache.qpid.jms.jndi.JmsInitialContextFactory InitialContextFactory クラスの実装を提供します。これは、3 つの主な方法で設定および使用できます。
- Java Classpath 上の
jndi.propertiesファイルを介して行います。 - Classpath で名前が付けられたファイル
jndi.propertiesを追加して、java.naming.factory.initialプロパティーを value に設定します。org.apache.qpid.jms.jndi.JmsInitialContextFactoryInitialContext オブジェクトをインスタンス化すると、QpidInitialContextFactory実装が検出されます。javax.naming.Context ctx = new javax.naming.InitialContext();コンテキストに含める特定の Queue オブジェクトおよび Topic オブジェクトはConnectionFactory、jndi.propertiesファイル内で直接プロパティー(以下の構文)またはjava.naming.provider.urlプロパティーをjndi.properties使用して参照される別のファイルで設定されます。 - システムプロパティーを使用した場合。
java.naming.factory.initialシステムプロパティーを value に設定org.apache.qpid.jms.jndi.JmsInitialContextFactoryInitialContext オブジェクトをインスタンス化すると、QpidInitialContextFactory実装が検出されます。javax.naming.Context ctx = new javax.naming.InitialContext();含めるコンテキストの特定のConnectionFactoryQueue オブジェクトおよび Topic オブジェクトは、java.naming.provider.urlシステムプロパティーを使用して渡されるファイルのプロパティーとして設定されます。これらのプロパティーの構文は以下のとおりです。- 環境の Hashtable をプログラムで使用。
- InitialContext は、作成中に環境を渡すことで直接設定できます。
Hashtable<Object, Object> env = new Hashtable<Object, Object>(); env.put(Context.INITIAL_CONTEXT_FACTORY, "org.apache.qpid.jms.jndi.JmsInitialContextFactory"); javax.naming.Context context = new javax.naming.InitialContext(env);コンテキストに含める特定の Queue オブジェクトおよび Topic オブジェクトはConnectionFactory、環境内で直接 Hashtable または Hashtable 環境内で参照される別のファイルで、プロパティー(以下の構文)として設定されjava.naming.provider.urlます。
| property | 構文 |
|---|---|
| ConnectionFactory | connectionfactory.lookupName = URI |
| Queue | queue.lookupName = queueName |
| トピック | topic.lookupName = topicName |
ConnectionFactoryキュー、および Topic の定義に使用される以下のプロパティーについて考えてみましょう。
connectionfactory.myFactoryLookup = amqp://localhost:5672
queue.myQueueLookup = queueA
topic.myTopicLookup = topicA
ConnectionFactory factory = (ConnectionFactory) context.lookup("myFactoryLookup");
Queue queue = (Queue) context.lookup("myQueueLookup");
Topic topic = (Topic) context.lookup("myTopicLookup");
21.2. QPID AMQP 1.0 JMS クライアント接続 URL リンクのコピーリンクがクリップボードにコピーされました!
amqp://hostname:port[?option=value[&option2=value...]]
ConnectionFactory、以下の表で説明されています。
Connection、、、Session MessageConsumer およびなどの JMS オブジェクトの動作に適用され MessageProducerます。
| オプション | description |
|---|---|
jms.username
|
接続の認証に使用されるユーザー名の値
|
jms.password
|
接続の認証に使用されるパスワードの値
|
jms.clientID
|
コネクションに適用される ClientID 値。
|
jms.forceAsyncSend
|
からすべてのメッセージが送信されたかどうかを設定します。
MessageProducer トランザクション内のメッセージや非永続的なメッセージなどの認定されるメッセージのみを非同期に送信します。
|
jms.alwaysSyncSend
|
すべての非同期送信条件をオーバーライドし、常にすべてのメッセージを送信する
MessageProducer 同期的に。
|
jms.sendAcksAsync
|
すべてのメッセージの確認応答が非同期的に送信されるようにします。
|
jms.localMessageExpiry
|
かどうかを制御します。
MessageConsumer インスタンスは有効期限の切れたメッセージをローカルでフィルターするか、配信します。デフォルトでは、この値は true に設定され、期限切れのメッセージはフィルターされます。
|
jms.localMessagePriority
|
事前フェッチメッセージを有効にした場合には、指定の Message の優先度の値に基づいてローカルで順番が変更されます。デフォルトは false です。
|
jms.validatePropertyNames
|
メッセージプロパティー名が有効な Java 識別子として検証される必要がある場合。デフォルトはです
true。
|
jms.queuePrefix
|
JMS セッションから作成されたキューの名前に追加される任意の接頭辞値。
|
jms.topicPrefix
|
JMS セッションから作成された Topic の名前に追加される任意の接頭辞の値です。
|
jms.closeTimeout
|
接続が閉じられてから返されるまでの待機時間を制御するタイムアウト値。デフォルトでは、クライアントは通常のクローズ完了イベントまで 15 秒待機します。
|
jms.connectTimeout
|
クライアントが接続確立で待機してからエラーを返す時間を制御するタイムアウト値。デフォルトでは、クライアントは接続が確立されるまで 15 秒間待機した後、失敗します。
|
jms.clientIDPrefix
|
新しい Connection が JMS 用に作成されるときに生成されるクライアント ID 値に使用されるオプションの接頭辞値
ConnectionFactory。デフォルトのプレフィックスはです ID:。
|
jms.connectionIDPrefix
|
JMS に新しい Connection が作成されたときに生成された Connection ID の値に使用されるオプションの接頭辞値
ConnectionFactory。この接続 ID は、JMS Connection オブジェクトから一部の情報をログに記録する際に使用されます。これにより、設定可能な接頭辞によりログの階層化が容易になります。デフォルトのプレフィックスはです ID:。
|
| オプション | description |
|---|---|
jms.prefetchPolicy.queuePrefetch
|
デフォルトはです。
1000
|
jms.prefetchPolicy.topicPrefetch
|
デフォルトはです。
1000
|
jms.prefetchPolicy.queueBrowserPrefetch
|
デフォルトはです。
1000
|
jms.prefetchPolicy.durableTopicPrefetch
|
デフォルトはです。
1000
|
jms.prefetchPolicy.all
|
すべての事前フェッチ値を 1 度に設定するために使用されます。
|
RedeliveryPolicy パラメーターは、再配信されたメッセージをクライアント上でどのように処理するかを制御します。
| オプション | description |
|---|---|
jms.redeliveryPolicy.maxRedeliveries | 再配信される回数に基づいて受信メッセージを拒否するタイミングを制御します。デフォルト値は無効(-1)です。値がゼロ(0)の場合は、メッセージの再配信が許可されないことが示されます。5(5)を指定すると、メッセージを 5 回再配信できます。 |
amqp://localhost:5672?jms.clientID=foo&transport.connectTimeout=30000
| オプション | description |
|---|---|
transport.sendBufferSize
|
デフォルトはです。
64k
|
transport.receiveBufferSize
|
デフォルトはです。
64k
|
transport.trafficClass
|
デフォルトはです。
0
|
transport.connectTimeout
|
デフォルトは
60 seconds です。
|
transport.soTimeout
|
デフォルトはです。
-1
|
transport.soLinger
|
デフォルトはです。
-1
|
transport.tcpKeepAlive
|
デフォルトはです。
false
|
transport.tcpNoDelay
|
デフォルトはです。
true
|
amqps://localhost:5673
| オプション | description |
|---|---|
transport.keyStoreLocation
|
デフォルトはシステムプロパティーから読み取られます。
javax.net.ssl.keyStore
|
transport.keyStorePassword
|
デフォルトはシステムプロパティーから読み取られます。
javax.net.ssl.keyStorePassword
|
transport.trustStoreLocation
|
デフォルトはシステムプロパティーから読み取られます。
javax.net.ssl.trustStore
|
transport.trustStorePassword
|
デフォルトはシステムプロパティーから読み取られます。
javax.net.ssl.keyStorePassword
|
transport.storeType
|
使用されるトラストストアのタイプ。デフォルトはです
JKS。
|
transport.contextProtocol
|
SSLContext の取得時に使用されるプロトコル引数。デフォルトはです
TLS。
|
transport.enabledCipherSuites
|
有効にする暗号スイート。コンマ区切り。デフォルトなし。コンテキストのデフォルト暗号が使用されます。無効にした暗号は、すべてこれより削除されます。
|
transport.disabledCipherSuites
|
無効にする暗号スイート(コンマ区切り)。ここに一覧表示されている暗号は、有効な暗号から削除されます。デフォルトは指定しません。
|
transport.enabledProtocols
|
有効にするプロトコル(コンマ区切り)。デフォルトなし。コンテキストのデフォルトプロトコルが使用されます。無効にしたプロトコルは、すべてこれから削除されます。
|
transport.disabledProtocols
|
無効にするプロトコル(コンマ区切り)。ここに一覧表示されているプロトコルは、有効なプロトコルから削除されます。デフォルトはです
SSLv2Hello,SSLv3。
|
transport.trustAll
|
設定された信頼ストアに関係なく、提供されるサーバー証明書を暗黙的に信頼するかどうか。デフォルトはです
false。
|
transport.verifyHost
|
接続しているホスト名が提供されたサーバー証明書と一致していることを検証するかどうか。デフォルトはです
true。
|
transport.keyAlias
|
クライアント証明書をサーバーに送信する必要がある場合にキーストアからキーペアを選択する際に使用するエイリアス。デフォルトは指定しません。
|
| オプション | description |
|---|---|
amqp.idleTimeout
|
ピアが AMQP フレームを送信しない場合に接続が失敗するアイドルタイムアウト(ミリ秒単位)。デフォルトはです
60000。
|
amqp.vhost
| vhost に接続します。SASL および Open hostname フィールドに値を設定するために使用されます。デフォルトは Connection URI の主要なホスト名です。
|
amqp.saslLayer
|
接続が SASL レイヤーを使用するかどうかを制御します。デフォルトはです
true。
|
amqp.saslMechanisms
|
クライアントによって選択でき、サーバーが提供し、設定された認証情報で使用できる SASL メカニズム。1 つ以上のメカニズムを指定する場合はコンマで区切ります。デフォルトは、、、、およびであるすべてのクライアントがサポートするメカニズムから選択できるように
EXTERNAL CRAM-MD5 PLAINし ANONYMOUSます。
|
amqp.maxFrameSize
|
max-frame-size の値は、ピアにアドバタイズされるバイト単位の値です。デフォルトはです
1048576。
|
failover 接頭辞で開始され、ブローカーの URI の一覧は括弧内に含まれます。
jms. オプションは、括弧外にあるフェイルオーバー URI 全体に適用され、そのライフタイムの JMS Connection オブジェクトに影響します。
failover:(amqp://host1:5672,amqp://host2:5672)?jms.clientID=foo&failover.maxReconnectAttempts=20
transport. または amqp. オプションを使用し、各ホストが接続されたときにこれらを適用することができます。
failover:(amqp://host1:5672?amqp.option=value,amqp://host2:5672?transport.option=value)?jms.clientID=foo
| オプション | description |
|---|---|
failover.initialReconnectDelay
|
クライアントがリモートピアへの再接続を試みるまで待機する時間。デフォルト値はゼロ(
0)で、最初の試行は即時に行われます。
|
failover.reconnectDelay
|
連続する再接続試行間の遅延を制御します(デフォルトは
10 ミリ秒)。backoff オプションが有効になっていないと、この値は一定のままになります。
|
failover.maxReconnectDelay
|
再接続を試行するまでクライアントが待機する最大時間。この値は、遅延が大きくなり過ぎないようにバックオフ機能が有効になっている場合にのみ使用されます。接続試行の最大時間として、デフォルトで
30 秒数になります。
|
failover.useReconnectBackOff
|
設定された乗数に基づいて再接続試行の間隔が増大するかどうかを制御します。このオプションのデフォルトはです
true。
|
failover.reconnectBackOffMultiplier
|
再接続の遅延値を拡張するために使用される乗数のデフォルトはです
2.0d。
|
failover.maxReconnectAttempts
|
接続を失敗したとクライアントに報告する前の再接続試行回数。デフォルトは制限なしまたは(
-1)です。
|
failover.startupMaxReconnectAttempts
|
このオプションの前にリモートピアに接続されていないクライアントでは、接続に失敗したと報告するまでの接続試行回数を制御します。デフォルトは、の値を使用し
maxReconnectAttemptsます。
|
failover.warnAfterReconnectAttempts
|
フェイルオーバーの再接続が試行されたことを示すメッセージをクライアントがログに記録する頻度を制御します。デフォルトでは、すべての
10 接続試行をログに記録します。
|
transport. および amqp. URI オプションを使用して実行されますが、でプレフィックスが付けられ failover.nested.ます。たとえば、amqp.vhost オプションに同じ値を接続しているすべてのブローカーに適用するには、以下のような URI がある場合があります。
failover:(amqp://host1:5672,amqp://host2:5672)?jms.clientID=foo&failover.nested.amqp.vhost=myhost
failover.nested. discovery.discoveredます。たとえば、エージェント URI の詳細がない場合、一般的な検出 URI は以下のようになります。
discovery:(<agent-uri>)?discovery.maxReconnectAttempts=20&discovery.discovered.jms.clientID=foo
discovery:(file:///path/to/monitored-file?updateInterval=60000)
updateInterval。これは、ファイルを検査する頻度(ミリ秒単位)を制御します。デフォルト値はです 30000。
discovery:(multicast://default?group=default)
239.255.2.3:6155)。マルチキャスト設定で使用する実際の IP およびポートを指定するには、これを変更することができます。
group。これは、どのマルチキャストグループメッセージがリッスンされるかを制御します。デフォルト値はです default。
21.3. QPID AMQP 1.0 JMS クライアントロギング リンクのコピーリンクがクリップボードにコピーされました!
org.apache.qpid.jms 階層: 必要に応じてロギング実装を設定できます。
- 環境変数を(Java システムプロパティーではなく)
PN_TRACE_FRMに設定します。これによりtrue、Proton はフレームログを標準出力(stdout)に記録します。 - クライアントがプロトコルトレーサーを Proton
amqp.traceFrames=trueに追加して、接続 URI にオプションを追加し、以下を設定します。org.apache.qpid.jms.provider.amqp.FRAMESログTRACEに出力が含まれるロガー。
第22章 Qpid C++ Messaging の .NET バインディング リンクのコピーリンクがクリップボードにコピーされました!
22.1. C++ メッセージングクライアントの例の.NET バインディング リンクのコピーリンクがクリップボードにコピーされました!
| 名前の例 | 説明の例 |
|---|---|
csharp.example.server | レシーバーを作成し、メッセージをリッスンします。受信時に、メッセージのコンテンツは大文字に変換され、受信したメッセージの ReplyTo アドレスに転送されます。 |
csharp.example.client | サーバーに一連のメッセージを送信し、元のメッセージの内容と受信したメッセージコンテンツを出力します。 |
関連項目
22.2. C++ メッセージング API の『.NET バインディングクラスマッピング』 リンクのコピーリンクがクリップボードにコピーされました!
| 名前の例 | 説明の例 |
|---|---|
csharp.map.receiver | レシーバーを作成し、マップメッセージをリッスンします。受信時にメッセージがデコードされ、コンソールに表示されます。 |
csharp.map.sender | マップメッセージを作成し、そのメッセージをに送信し map.receiverます。マップメッセージには、サポートされるすべての .NET メッセージングバインディングデータタイプの値が含まれます。 |
関連項目
22.3. .NET バインディング(C++ Messaging API クラス: Address) リンクのコピーリンクがクリップボードにコピーされました!
| .NET バインディングクラス: Address | |
|---|---|
| 言語 | 構文 |
| C++ | class Address |
| .NET | public ref class Address |
| コンストラクター | |
| C++ | Address(); |
| .NET | public Address(); |
| コンストラクター | |
| C++ | Address(const std::string& address); |
| .NET | public Address(string address); |
| コンストラクター | |
| C++ | Address(const std::string& name, const std::string& subject, const qpid::types::Variant::Map& options, const std::string& type = ""); |
| .NET | public Address(string name, string subject, Dictionary<string, object> options); |
| .NET | public Address(string name, string subject, Dictionary<string, object> options, string type); |
| コンストラクターのコピー | |
| C++ | Address(const Address& address); |
| .NET | public Address(Address address); |
| デストラクター | |
| C++ | ~Address(); |
| .NET | ~Address(); |
| finalizer | |
| C++ | 該当なし |
| .NET | !Address(); |
| 割り当て演算子をコピーする | |
| C++ | Address& operator=(const Address&); |
| .NET | public Address op_Assign(Address rhs); |
| property: 名前 | |
| C++ | const std::string& getName() const; |
| C++ | void setName(const std::string&); |
| .NET | public string Name { get; set; } |
| property: Subject | |
| C++ | const std::string& getSubject() const; |
| C++ | void setSubject(const std::string&); |
| .NET | public string Subject { get; set; } |
| プロパティー: オプション | |
| C++ | const qpid::types::Variant::Map& getOptions() const; |
| C++ | qpid::types::Variant::Map& getOptions(); |
| C++ | void setOptions(const qpid::types::Variant::Map&); |
| .NET | public Dictionary<string, object> Options { get; set; } |
| プロパティー: タイプ | |
| C++ | std::string getType() const; |
| C++ | void setType(const std::string&); |
| .NET | public string Type { get; set; } |
| その他の部分 | |
| C++ | std::string str() const; |
| .NET | public string ToStr(); |
| その他の部分 | |
| C++ | operator bool() const; |
| .NET | 該当なし |
| その他の部分 | |
| C++ | bool operator !() const; |
| .NET | 該当なし |
関連項目
22.4. .NET Binding for the C++ Messaging API Class: Connection リンクのコピーリンクがクリップボードにコピーされました!
| .NET Binding Class: Connection | |
|---|---|
| 言語 | 構文 |
| C++ | class Connection : public qpid::messaging::Handle<ConnectionImpl> |
| .NET | public ref class Connection |
| コンストラクター | |
| C++ | Connection(ConnectionImpl* impl); |
| .NET | 該当なし |
| コンストラクター | |
| C++ | Connection(); |
| .NET | 該当なし |
| コンストラクター | |
| C++ | Connection(const std::string& url, const qpid::types::Variant::Map& options = qpid::types::Variant::Map()); |
| .NET | public Connection(string url); |
| .NET | public Connection(string url, Dictionary<string, object> options); |
| コンストラクター | |
| C++ | Connection(const std::string& url, const std::string& options); |
| .NET | public Connection(string url, string options); |
| Copy Constructor | |
| C++ | Connection(const Connection&); |
| .NET | public Connection(Connection connection); |
| デストラクター | |
| C++ | ~Connection(); |
| .NET | ~Connection(); |
| finalizer | |
| C++ | 該当なし |
| .NET | !Connection(); |
| 割り当て演算子をコピーする | |
| C++ | Connection& operator=(const Connection&); |
| .NET | public Connection op_Assign(Connection rhs); |
| method: setOption | |
| C++ | void setOption(const std::string& name, const qpid::types::Variant& value); |
| .NET | public void SetOption(string name, object value); |
| メソッド: オープン | |
| C++ | void open(); |
| .NET | public void Open(); |
| プロパティー: isOpen | |
| C++ | bool isOpen(); |
| .NET | public bool IsOpen { get; } |
| method: close | |
| C++ | void close(); |
| .NET | public void Close(); |
| メソッド: createTransactionalSession | |
| C++ | Session createTransactionalSession(const std::string& name = std::string()); |
| .NET | public Session CreateTransactionalSession(); |
| .NET | public Session CreateTransactionalSession(string name); |
| メソッド: createSession | |
| C++ | Session createSession(const std::string& name = std::string()); |
| .NET | public Session CreateSession(); |
| .NET | public Session CreateSession(string name); |
| メソッド: getSession | |
| C++ | Session getSession(const std::string& name) const; |
| .NET | public Session GetSession(string name); |
Property: AuthenticatedUsername | |
| C++ | std::string getAuthenticatedUsername(); |
| .NET | public string GetAuthenticatedUsername(); |
関連項目
22.5. .NET Binding for the C++ Messaging API Class: Duration リンクのコピーリンクがクリップボードにコピーされました!
| .NET バインディングクラス: Duration | |
|---|---|
| 言語 | 構文 |
| C++ | class Duration |
| .NET | public ref class Duration |
| コンストラクター | |
| C++ | explicit Duration(uint64_t milliseconds); |
| .NET | public Duration(ulong mS); |
| コンストラクターのコピー | |
| C++ | 該当なし |
| .NET | public Duration(Duration rhs); |
| デストラクター | |
| C++ | デフォルト |
| .NET | デフォルト |
| finalizer | |
| C++ | 該当なし |
| .NET | デフォルト |
| property: intervaliseconds | |
| C++ | uint64_t getMilliseconds() const; |
| .NET | public ulong Milliseconds { get; } |
| operator: * | |
| C++ | Duration operator*(const Duration& duration, uint64_t multiplier); |
| .NET | public static Duration operator *(Duration dur, ulong multiplier); |
| .NET | public static Duration Multiply(Duration dur, ulong multiplier); |
| C++ | Duration operator*(uint64_t multiplier, const Duration& duration); |
| .NET | public static Duration operator *(ulong multiplier, Duration dur); |
| .NET | public static Duration Multiply(ulong multiplier, Duration dur); |
| 定数 | |
| C++ | static const Duration FOREVER; |
| C++ | static const Duration IMMEDIATE; |
| C++ | static const Duration SECOND; |
| C++ | static const Duration MINUTE; |
| .NET | public sealed class DurationConstants |
| .NET | public static Duration FORVER; |
| .NET | public static Duration IMMEDIATE; |
| .NET | public static Duration MINUTE; |
| .NET | public static Duration SECOND; |
関連項目
22.6. .NET Binding for the C++ Messaging API Class: failoverUpdates リンクのコピーリンクがクリップボードにコピーされました!
| .NET Binding Class: failoverUpdates | |
|---|---|
| 言語 | 構文 |
| C++ | class FailoverUpdates |
| .NET | public ref class FailoverUpdates |
| コンストラクター | |
| C++ | FailoverUpdates(Connection& connection); |
| .NET | public FailoverUpdates(Connection connection); |
| デストラクター | |
| C++ | ~FailoverUpdates(); |
| .NET | ~FailoverUpdates(); |
| finalizer | |
| C++ | 該当なし |
| .NET | !FailoverUpdates(); |
関連項目
22.7. .NET バインディング(C++ Messaging API クラス用): Message リンクのコピーリンクがクリップボードにコピーされました!
| .NET バインディングクラス: Message | |
|---|---|
| 言語 | 構文 |
| C++ | class Message |
| .NET | public ref class Message |
| コンストラクター | |
| C++ | Message(const std::string& bytes = std::string()); |
| .NET | Message(); |
| .NET | Message(System::String ^ theStr); |
| .NET | Message(System::Object ^ theValue); |
| .NET | Message(array<System::Byte> ^ bytes); |
| コンストラクター | |
| C++ | Message(const char*, size_t); |
| .NET | public Message(byte[] bytes, int offset, int size); |
| Copy Constructor | |
| C++ | Message(const Message&); |
| .NET | public Message(Message message); |
| 割り当て演算子をコピーする | |
| C++ | Message& operator=(const Message&); |
| .NET | public Message op_Assign(Message rhs); |
| デストラクター | |
| C++ | ~Message(); |
| .NET | ~Message(); |
| finalizer | |
| C++ | 該当なし |
| .NET | !Message() |
| property: ReplyTo | |
| C++ | void setReplyTo(const Address&); |
| C++ | const Address& getReplyTo() const; |
| .NET | public Address ReplyTo { get; set; } |
| property: Subject | |
| C++ | void setSubject(const std::string&); |
| C++ | const std::string& getSubject() const; |
| .NET | public string Subject { get; set; } |
| Property: ContentType | |
| C++ | void setContentType(const std::string&); |
| C++ | const std::string& getContentType() const; |
| .NET | public string ContentType { get; set; } |
| property: MessageId | |
| C++ | void setMessageId(const std::string&); |
| C++ | const std::string& getMessageId() const; |
| .NET | public string MessageId { get; set; } |
| property: UserId | |
| C++ | void setUserId(const std::string&); |
| C++ | const std::string& getUserId() const; |
| .NET | public string UserId { get; set; } |
| プロパティー: CorrelationId | |
| C++ | void setCorrelationId(const std::string&); |
| C++ | const std::string& getCorrelationId() const; |
| .NET | public string CorrelationId { get; set; } |
| プロパティー: Priority | |
| C++ | void setPriority(uint8_t); |
| C++ | uint8_t getPriority() const; |
| .NET | public byte Priority { get; set; } |
| プロパティー: Ttl | |
| C++ | void setTtl(Duration ttl); |
| C++ | Duration getTtl() const; |
| .NET | public Duration Ttl { get; set; } |
| プロパティー: Durable | |
| C++ | void setDurable(bool durable); |
| C++ | bool getDurable() const; |
| .NET | public bool Durable { get; set; } |
| プロパティー: Redelivered | |
| C++ | bool getRedelivered() const; |
| C++ | void setRedelivered(bool); |
| .NET | public bool Redelivered { get; set; } |
| メソッド: setProperty | |
| C++ | void setProperty(const std::string&, const qpid::types::Variant&); |
| .NET | public void SetProperty(string name, object value); |
| プロパティー: プロパティー | |
| C++ | const qpid::types::Variant::Map& getProperties() const; |
| C++ | qpid::types::Variant::Map& getProperties(); |
| .NET | public Dictionary<string, object> Properties { get; set; } |
| Method: SetContent | |
| C++ | void setContent(const std::string&); |
| C++ | void setContent(const char* chars, size_t count); |
| .NET | public void SetContent(byte[] bytes); |
| .NET | public void SetContent(string content); |
| .NET | public void SetContent(byte[] bytes, int offset, int size); |
| メソッド: GetContent | |
| C++ | std::string getContent() const; |
| .NET | public string GetContent(); |
| .NET | public void GetContent(byte[] arr); |
| .NET | public void GetContent(Collection<object> __p1); |
| .NET | public void GetContent(Dictionary<string, object> dict); |
| Method: GetContentPtr | |
| C++ | const char* getContentPtr() const; |
| .NET | 該当なし |
| プロパティー: ContentSize | |
| C++ | size_t getContentSize() const; |
| .NET | public ulong ContentSize { get; } |
| struct: EncodingException | |
| C++ | struct EncodingException : qpid::types::Exception |
| .NET | 該当なし |
| method: デコード | |
| C++ | void decode(const Message& message, qpid::types::Variant::Map& map, const std::string& encoding = std::string()); |
| C++ | void decode(const Message& message, qpid::types::Variant::List& list, const std::string& encoding = std::string()); |
| .NET | 該当なし |
| メソッド: encode | |
| C++ | void encode(const qpid::types::Variant::Map& map, Message& message, const std::string& encoding = std::string()); |
| C++ | void encode(const qpid::types::Variant::List& list, Message& message, const std::string& encoding = std::string()); |
| .NET | 該当なし |
| メソッド: AsString | |
| C++ | 該当なし |
| .NET | public string AsString(object obj); |
| .NET | public string ListAsString(Collection<object> list); |
| .NET | public string MapAsString(Dictionary<string, object> dict); |
関連項目
22.8. .NET バインディング(C++ Messaging API クラス: Receiver) リンクのコピーリンクがクリップボードにコピーされました!
| .NET Binding Class: Receiver | |
|---|---|
| 言語 | 構文 |
| C++ | class Receiver |
| .NET | public ref class Receiver |
| コンストラクター | |
| .NET | Constructed object is returned by Session.CreateReceiver |
| コンストラクターのコピー | |
| C++ | Receiver(const Receiver&); |
| .NET | public Receiver(Receiver receiver); |
| デストラクター | |
| C++ | ~Receiver(); |
| .NET | ~Receiver(); |
| finalizer | |
| C++ | 該当なし |
| .NET | !Receiver() |
| 割り当て演算子をコピーする | |
| C++ | Receiver& operator=(const Receiver&); |
| .NET | public Receiver op_Assign(Receiver rhs); |
| メソッド: Get | |
| C++ | bool get(Message& message, Duration timeout=Duration::FOREVER); |
| .NET | public bool Get(Message mmsgp); |
| .NET | public bool Get(Message mmsgp, Duration durationp); |
| メソッド: Get | |
| C++ | Message get(Duration timeout=Duration::FOREVER); |
| .NET | public Message Get(); |
| .NET | public Message Get(Duration durationp); |
| メソッド: Fetch | |
| C++ | bool fetch(Message& message, Duration timeout=Duration::FOREVER); |
| .NET | public bool Fetch(Message mmsgp); |
| .NET | public bool Fetch(Message mmsgp, Duration duration); |
| メソッド: Fetch | |
| C++ | Message fetch(Duration timeout=Duration::FOREVER); |
| .NET | public Message Fetch(); |
| .NET | public Message Fetch(Duration durationp); |
| property: Capacity | |
| C++ | void setCapacity(uint32_t); |
| C++ | uint32_t getCapacity(); |
| .NET | public uint Capacity { get; set; } |
| プロパティー: Available | |
| C++ | uint32_t getAvailable(); |
| .NET | public uint Available { get; } |
| property: Unsettled | |
| C++ | uint32_t getUnsettled(); |
| .NET | public uint Unsettled { get; } |
| メソッド: 閉じる | |
| C++ | void close(); |
| .NET | public void Close(); |
| property: IsClosed | |
| C++ | bool isClosed() const; |
| .NET | public bool IsClosed { get; } |
| property: 名前 | |
| C++ | const std::string& getName() const; |
| .NET | public string Name { get; } |
| プロパティー: Session | |
| C++ | Session getSession() const; |
| .NET | public Session Session { get; } |
関連項目
22.9. .NET Binding for the C++ Messaging API Class: Sender リンクのコピーリンクがクリップボードにコピーされました!
| .NET Binding Class: Sender | |
|---|---|
| 言語 | 構文 |
| C++ | class Sender |
| .NET | public ref class Sender |
| コンストラクター | |
| .NET | Constructed object is returned by session.createSender |
| コンストラクターのコピー | |
| C++ | Sender(const Sender&); |
| .NET | public Sender(Sender sender); |
| デストラクター | |
| C++ | ~Sender(); |
| .NET | ~Sender(); |
| finalizer | |
| C++ | 該当なし |
| .NET | !Sender() |
| 割り当て演算子をコピーする | |
| C++ | Sender& operator=(const Sender&); |
| .NET | public Sender op_Assign(Sender rhs); |
| メソッド: Send | |
| C++ | void send(const Message& message, bool sync=false); |
| .NET | public void Send(Message mmsgp); |
| .NET | public void Send(Message mmsgp, bool sync); |
| メソッド: 閉じる | |
| C++ | void close(); |
| .NET | public void Close(); |
| property: Capacity | |
| C++ | void setCapacity(uint32_t); |
| C++ | uint32_t getCapacity(); |
| .NET | public uint Capacity { get; set; } |
| プロパティー: Available | |
| C++ | uint32_t getAvailable(); |
| .NET | public uint Available { get; } |
| property: Unsettled | |
| C++ | uint32_t getUnsettled(); |
| .NET | public uint Unsettled { get; } |
| property: 名前 | |
| C++ | const std::string& getName() const; |
| .NET | public string Name { get; } |
| プロパティー: Session | |
| C++ | Session getSession() const; |
| .NET | public Session Session { get; } |
関連項目
22.10. .NET Binding for the C++ Messaging API Class: Session リンクのコピーリンクがクリップボードにコピーされました!
| 言語 | 構文 |
|---|---|
| C++ | class Session |
| .NET | public ref class Session |
| コンストラクター | |
| .NET | 構築されたオブジェクトがによって返される Connection.CreateSession |
| コンストラクターのコピー | |
| C++ | Session(const Session&); |
| .NET | public Session(Session session); |
| デストラクター | |
| C++ | ~Session(); |
| .NET | ~Session(); |
| finalizer | |
| C++ | 該当なし |
| .NET | !Session() |
| 割り当て演算子をコピーする | |
| C++ | Session& operator=(const Session&); |
| .NET | public Session op_Assign(Session rhs); |
| メソッド: 閉じる | |
| C++ | void close(); |
| .NET | public void Close(); |
| メソッド: コミット | |
| C++ | void commit(); |
| .NET | public void Commit(); |
| メソッド: ロールバック | |
| C++ | void rollback(); |
| .NET | public void Rollback(); |
| method: Acknowledge | |
| C++ | void acknowledge(bool sync=false); |
| C++ | void acknowledge(Message&, bool sync=false); |
| .NET | public void Acknowledge(); |
| .NET | public void Acknowledge(bool sync); |
| .NET | public void Acknowledge(Message __p1); |
| .NET | public void Acknowledge(Message __p1, bool __p2); |
| メソッド: 拒否 | |
| C++ | void reject(Message&); |
| .NET | public void Reject(Message __p1); |
| 方法: リリース | |
| C++ | void release(Message&); |
| .NET | public void Release(Message __p1); |
| メソッド: 同期 | |
| C++ | void sync(bool block=true); |
| .NET | public void Sync(); |
| .NET | public void Sync(bool block); |
| property: Receivable | |
| C++ | uint32_t getReceivable(); |
| .NET | public uint Receivable { get; } |
| Property: UnsettledAcks | |
| C++ | uint32_t getUnsettledAcks(); |
| .NET | public uint UnsettledAcks { get; } |
| メソッド: NextReceiver | |
| C++ | bool nextReceiver(Receiver&, Duration timeout=Duration::FOREVER); |
| .NET | public bool NextReceiver(Receiver rcvr); |
| .NET | public bool NextReceiver(Receiver rcvr, Duration timeout); |
| メソッド: NextReceiver | |
| C++ | Receiver nextReceiver(Duration timeout=Duration::FOREVER); |
| .NET | public Receiver NextReceiver(); |
| .NET | public Receiver NextReceiver(Duration timeout); |
| メソッド: CreateSender | |
| C++ | Sender createSender(const Address& address); |
| .NET | public Sender CreateSender(Address address); |
| メソッド: CreateSender | |
| C++ | Sender createSender(const std::string& address); |
| .NET | public Sender CreateSender(string address); |
| Method: CreateReceiver | |
| C++ | Receiver createReceiver(const Address& address); |
| .NET | public Receiver CreateReceiver(Address address); |
| Method: CreateReceiver | |
| C++ | Receiver createReceiver(const std::string& address); |
| .NET | public Receiver CreateReceiver(string address); |
| メソッド: GetSender | |
| C++ | Sender getSender(const std::string& name) const; |
| .NET | public Sender GetSender(string name); |
| メソッド: GetReceiver | |
| C++ | Receiver getReceiver(const std::string& name) const; |
| .NET | public Receiver GetReceiver(string name); |
| プロパティー: Connection | |
| C++ | Connection getConnection() const; |
| .NET | public Connection Connection { get; } |
| プロパティー: HasError | |
| C++ | bool hasError(); |
| .NET | public bool HasError { get; } |
| メソッド: CheckError | |
| C++ | void checkError(); |
| .NET | public void CheckError(); |
関連項目
22.11. .NET クラス: SessionReceiver リンクのコピーリンクがクリップボードにコピーされました!
SessionReceiver クラスは、特定のセッションですべてのレシーバーが受信したメッセージに便利なコールバックメカニズムを提供します。
using Org.Apache.Qpid.Messaging;
using System;
namespace Org.Apache.Qpid.Messaging.SessionReceiver
{
public interface ISessionReceiver
{
void SessionReceiver(Receiver receiver, Message message);
}
public class CallbackServer
{
public CallbackServer(Session session, ISessionReceiver callback);
public void Close();
}
}
cpp/bindings/qpid/dotnet/examples/csharp.map.callback.receiverます。
関連項目
付録A 交換およびキュー宣言引数 リンクのコピーリンクがクリップボードにコピーされました!
A.1. Exchange およびキュー引数のリファレンス リンクのコピーリンクがクリップボードにコピーされました!
- 変更
qpid.last_value_queueqpid.last_value_queue_no_browse非推奨となり、削除されます。qpid.msg_sequence置き換えられqpid.queue_msg_sequenceたキュー引数。ring_strictおよびflow_to_diskが有効なqpid.policy_type値でなくなりました。qpid.persist_last_node非推奨となり、削除されています。
交換オプション
- qpid.exclusive-binding (bool)
- 指定のバインディングキーが 1 つのキューのみに関連付けられるようにします。
- qpid.ive (bool)
- if がに設定します。 「true」交換は 初期値交換で、他の交換 と異なります。交換に送信された最後のメッセージがキャッシュされ、新しいキューが交換にバインドされている場合は、メッセージがバインディング基準に適合する場合、このメッセージをキューにルーティングしようとします。これにより、新しいキューが最後に受信したメッセージを初期値として使用することができます。
- qpid.msg_sequence (bool)
- if がに設定します。 「true」交換によって、という名前のシーケンス番号が挿入されます。 「qpid.msg_sequence」 各メッセージのメッセージヘッダーに切り替えます。このシーケンス番号のタイプは int64 です。交換から最初のメッセージのシーケンス番号は 1 で、後続のメッセージごとに順番に増分されます。qpid ブローカーの再起動時にシーケンス番号が 1 にリセットされます。
- qpid.sequence_counter (int64)
- 指定の番号で
qpid.msg_sequenceカウントを開始します。
キューオプション
- no-local (bool)
- キューがキューを宣言するのと同じ接続のセッションによってキューに格納されたメッセージを破棄することを指定します。
- qpid.alert_count (uint32_t)
- キューメッセージ数がこのサイズを超える場合は、アラートを送信する必要があります。
- qpid.alert_repeat_gap (int64_t)
- イベント間の最小間隔を秒単位で制御します。デフォルト値は 60 秒です。
- qpid.alert_size (int64_t)
- キューサイズ(バイト単位)がこの値を超えると、アラートが送信されます。
- qpid.auto_delete_timeout (bool)
- キューが自動的に削除されるように設定されている場合、キューはここで指定されている秒数後に削除されます。
- qpid.browse-only (bool)
- キューのすべてのユーザーは、参照を強制されます。リング、LVQ、または TTL でキューのサイズを制限します。この引数名はアンダースコアではなくハイフンを使用することに注意してください。
- qpid.file_count (int)
- キューの永続ジャーナルにファイル数を設定します。デフォルト値は 8 です。
- qpid.file_size (int64)
- ファイルのページ数を設定します(各ページは 64 KB です)。デフォルト値は 24 です。
- qpid.flow_resume_count (uint32_t)
- フローはしきい値をメッセージ数として再開します。
- qpid.flow_resume_size (uint64_t)
- フローは、バイト単位でしきい値を再開します。
- qpid.flow_stop_count (uint32_t)
- フローがメッセージ数としてしきい値を停止します。
- qpid.flow_stop_size (uint64_t)
- フロー停止のしきい値(バイト単位)。
- qpid.last_value_queue_key (文字列)
- 最後の値キューに使用するキーを定義します。
- qpid.max_count (uint32_t)
- policy_type が判断されるアクションの前にキューに格納できるメッセージデータの最大バイトサイズ。
- qpid.max_size (uint64_t)
- が決定するアクションの前にキューに含まれること policy_type ができるメッセージの最大数。
- qpid.policy_type (文字列)
- キューサイズを制御するデフォルトの動作を設定します。有効な値は
rejectおよびですring。 - qpid.priorities (size_t)
- キューが認識する固有の優先度レベルの数(最大 10)。デフォルト値は 1 レベルです。
- qpid.queue_msg_sequence (文字列)
- 指定された名前のカスタムヘッダーをキューに格納されたメッセージに追加します。このヘッダーには、シーケンス番号が自動的に設定されます。
- qpid.trace.exclude (文字列)
- 指定の(コンマ区切り)トレース ID の 1 つを含むメッセージを送信しません。
- qpid.trace.id (文字列)
- 指定されたトレース ID を、キューから送信されたメッセージのアプリケーションヘッダー
x-qpid.trace"" に追加します。 - x-qpid-maximum-message-count
- これはのエイリアスです
qpid.alert_count。 - x-qpid-maximum-message-size
- これはのエイリアスです
qpid.alert_size。 - x-qpid-minimum-alert-repeat-gap
- これはのエイリアスです
qpid.alert_repeat_gap。 - x-qpid-priorities
- これはのエイリアスです
qpid.priorities。
付録B 改訂履歴 リンクのコピーリンクがクリップボードにコピーされました!
| 改訂履歴 | |||
|---|---|---|---|
| 改訂 3.2.0-6 | Fri Oct 16 2015 | ||
| |||
| 改訂 3.2.0-5 | Thu Oct 8 2015 | ||
| |||
| 改訂 3.2.0-3 | Tue Sep 29 2015 | ||
| |||
| 改訂 3.2.0-1 | Tue Jul 14 2015 | ||
| |||
| 改訂 3.1.0-5 | Wed Apr 01 2015 | ||
| |||
| 改訂 3.0.0-4 | Tue Sep 23 2014 | ||
| |||