第7章 コアの使用
HornetQ コアは、独自の非 JMS API を持つ完全な JMS 不明メッセージングシステムです。これは、コア API と呼ばれます。
JMS を使用しない場合は、コア API を直接使用できます。コア API は、JMS のすべての機能を提供します (ただし、複雑さが大幅になくなります)。また、JMS を使用して利用できない機能を提供します。
7.1. コアメッセージングコンセプト
一部のコアメッセージングコンセプトは JMS のコンセプトに似ていますが、異なります。一般的に、コアメッセージング API は JMS API よりも単純です。これは、キュー、トピック、およびサブスクリプションの区別がないためです。これら主要なコアメッセージングコンセプトのそれぞれについて順番に説明します。
7.1.1. メッセージ
- メッセージは、クライアントとサーバー間で送信されるデータ単位です。
- メッセージは、データを読み書きする便利なメソッドを含むバッファであるボディを持ちます。
- メッセージは、キーと値のペアであるプロパティーセットを持ちます。各プロパティーキーは、文字列であり、プロパティー値のデータ型は整数、Long、Short、バイト、バイト[]、文字列、倍精度浮動小数点、浮動小数点、またはブールのいずれかになります。
- メッセージは送信先のアドレスを持ちます。メッセージはサーバーに到着すると、アドレスにバインドされたキューにルーティングされます。キューがフィルターにバインドされた場合は、フィルターが一致したときにのみ、メッセージがキューにルーティングされます。アドレスには多くのキューをバインドできます (または、アドレスにまったくキューをバインドしないことも可能です)。アドレスにバインドされた迂回のように、キュー以外のエンティティも存在することがあります。
- メッセージは durable または非 durable のいずれかになります。durable キューの durable メッセージは、サーバーがクラッシュしたり再起動したりした場合は保持されません。
- メッセージは、0 〜 9 の間の優先度値で指定できます。0 は最低の優先度を表し、9 は最大の優先度を表します。HornetQ は優先度が低いメッセージよりも優先度が高いメッセージを配信しようとします。
- メッセージは、オプションの失効期限で指定できます。HornetQ は、失効期限後にメッセージを配信しません。
- メッセージは、メッセージの送信時間を表すオプションのタイムスタンプを持ちます。
- また、HornetQ は非常に大きいメッセージ (ある時点で利用可能な RAM よりも大幅に大きいメッセージ) の送信または消費をサポートします。
7.1.2. アドレス
サーバーは、アドレスとキューセット間のマッピングを保持します。単一のアドレスには、ゼロ以上のキューをバインドできます。各キューはオプションのメッセージフィルターでバインドできます。メッセージがルーティングされる場合、メッセージはメッセージのアドレスにバインドされたキューのセットにルーティングされます。いずれかのキューがフィルター式でバインドされた場合、メッセージはそのフィルター式に一致するバインドされたキューのサブセットにのみルーティングされます。
迂回などの他のエンティティは、アドレスにもバインドでき、メッセージもルーティングされます。
注記
コアでは、トピックのコンセプトがありません。トピックは JMS 専用の用語です。代わりに、コアでは、アドレスとキューを取り扱います。
たとえば、JMS トピックは、多くのキューがバインドされる単一のアドレスによって実装されます。各キューはトピックのサブスクリプションを表します。JMS キューは 1 つのキューがバインドされる単一のアドレスとして実装されます。このキューは JMS キューを表します。
7.1.3. キュー
キューは durable にすることができます。この場合、含まれるメッセージは、durable である限りサーバーのクラッシュや再起動後も保持されます。非 durable キューは、含まれるメッセージが durable の場合であってもサーバーの再起動後やクラッシュ後に保持されません。
また、キューは、一時的である場合もあります。この場合、クライアント接続が閉じられたときに、キューが自動的に削除されます (この前にキューが明示的に削除されていない場合)。
キューは、オプションのフィルター式でバインドできます。フィルター式が提供された場合、サーバーはフィルター式に一致するメッセージのみをアドレスにバインドされたキューにルーティングします。
多くのキューは単一のアドレスにバインドできます。特定のキューは 1 つのアドレスの最大値にのみバインドされます。
7.1.4. ClientSessionFactory
クライアントは
ClientSessionFactory
インスタンスを使用して ClientSession
インスタンスを作成します。ClientSessionFactory
インスタンスは、サーバーに接続してセッションを作成する方法を認識し、多くの設定が可能です。
ClientSessionFactory
インスタンスは、HornetQClient
ファクトリークラスを使用して作成されます。
7.1.5. ClientSession
クライアントは、メッセージを消費および生成し、トランザクションでこれらをグループ化するために ClientSession を使用します。ClientSession インスタンスは、トランザクションセマンティクスと非トランザクションセマンティクスの両方をサポートし、JTA トランザクションの一部としてメッセージング操作を実行できるよう
XAResource
インターフェースを提供できます。
ClientSession インスタンスは、ClientConsumers と ClientProducers をグループ化します。
ClientSession インスタンスは、オプションんの
SendAcknowledgementHandler
で登録できます。これにより、送信されたメッセージがサーバーに正常に到着したときにクライアントコードに非動的に通知できます。この機能により、応答を受け取るまで送信された各メッセージに対してブロックせずに、送信されたメッセージがサーバーに到着するようになります。
送信された各メッセージに対するブロックは、送信された各メッセージに対してネットワークラウンドトリップを必要とするため、コストが高くなります。送信承認をブロックしたり、受け取ったりしないことにより、標準的な JMS API を使用できない実際のエンドツーエンド非同期システムを作成できます。この機能の詳細については、18章送信およびコミットの保証 を参照してください。
7.1.6. ClientConsumer
クライアントは、
ClientConsumer
インスタンスを使用してキューからメッセージを消費します。コアメッセージングは同期および非同期メッセージ消費セマンティクスをサポートします。ClientConsumer
インスタンスは、オプションのフィルター式で設定でき、その式に一致するメッセージのみを消費します。
7.1.7. ClientProducer
クライアントは、メッセージを送信できるよう
ClientSession
インスタンス上で ClientProducer
インスタンスを作成します。ClientProducer インスタンスは、送信されたすべてのメッセージがルーティングされるアドレスを使用できます。また、このインスタンスが指定されたアドレスを持たないようにすることもできます。この場合、アドレスはメッセージの送信時に指定されます。
警告
ClientSession、ClientProducer、および ClientConsumer インスタンスは再利用するよう設計されています。
生成または消費する各メッセージに対して ClientSession、ClientProducer、および ClientConsumer インスタンスを作成することは適切ではありません。これを行うと、アプリケーションのパフォーマンスが低下します。この詳細については、43章パフォーマンスチューニング で説明されています。