このガイドには、Java Message Service (JMS) 2.0 API を使用して Azure Service Bus との通信を成功させるために役立つ詳細情報が含まれています。
Java 開発者として、Azure Service Bus を初めて使用する場合は、次の記事をお読みください。
作業の開始 | 概念 |
---|---|
Java Message Service (JMS) プログラミング モデル
Java Message Service API プログラミング モデルは、次のセクションに示すとおりです。
注
Azure Service Bus Premium レベル では、JMS 1.1 と JMS 2.0 がサポートされます。
Azure Service Bus - Standard レベルでは、制限付きの JMS 1.1 機能がサポートされています。 詳細については、この ドキュメントを参照してください。
JMS - 構成要素
以下の構成要素は、JMS アプリケーションと通信するために使用できます。
注
以下のガイドは、Oracle Java EE 6 Tutorial for Java Message Service (JMS) から調整されています
Java Message Service (JMS) の理解を深めるために、このチュートリアルを参照することをお勧めします。
接続ファクトリ
接続ファクトリ オブジェクトは、JMS プロバイダーとの接続にクライアントによって使用されます。 接続ファクトリは、管理者によって定義された接続構成パラメーターのセットをカプセル化します。
各接続ファクトリは、 ConnectionFactory
、 QueueConnectionFactory
、または TopicConnectionFactory
インターフェイスのインスタンスです。
Azure Service Bus との接続を簡略化するために、これらのインターフェイスはそれぞれ ServiceBusJmsConnectionFactory
、 ServiceBusJmsQueueConnectionFactory
、または ServiceBusJmsTopicConnectionFactory
によって実装されます。
重要
JMS 2.0 API を利用する Java アプリケーションは、接続文字列を使用するか、Microsoft Entra でサポートされる認証を利用するための TokenCredential
を使用して Azure Service Bus に接続できます。 Microsoft Entra による認証を使用する場合は、必要に応じて ロールとアクセス許可を ID に割り当て るようにしてください。
Azure で システム割り当てマネージド ID を 作成し、この ID を使用して TokenCredential
を作成します。
TokenCredential tokenCredential = new DefaultAzureCredentialBuilder().build();
接続ファクトリは、次のパラメーターを使用してインスタンス化できます。
- トークン資格情報 - OAuth トークンを提供できる資格情報を表します。
- ホスト - Azure Service Bus Premium レベルの名前空間のホスト名。
- 次の設定を含んだ、ServiceBusJmsConnectionFactorySettings プロパティ バッグ
- connectionIdleTimeoutMS - アイドル状態の接続タイムアウト (ミリ秒単位)。
- traceFrames - デバッグ用に AMQP トレース フレームを収集するためのブール型フラグ。
- その他の構成パラメーター
次に示すように、ファクトリを作成できます。 トークン資格情報とホストは必須パラメーターですが、他のプロパティは省略可能です。
String host = "<YourNamespaceName>.servicebus.windows.net";
ConnectionFactory factory = new ServiceBusJmsConnectionFactory(tokenCredential, host, null);
JMS の送信先
宛先は、クライアントが生成するメッセージのターゲットと、クライアントが使用するメッセージのソースを指定するために使用するオブジェクトです。
送信先は、Azure Service Bus 内のエンティティにマッピングされます - キュー (ポイント間のシナリオの場合) とトピック (パブリッシュ/サブスクライブのシナリオの場合)。
接続
接続は、JMS プロバイダーとの仮想接続をカプセル化します。 Azure Service Bus では、AMQP 経由のアプリケーションと Azure Service Bus の間のステートフル接続を表します。
次の例に示すように、接続ファクトリから接続が作成されます。
Connection connection = factory.createConnection();
セッション
セッションは、メッセージを生成および使用するためのシングル スレッド コンテキストです。 メッセージ、メッセージ プロデューサー、コンシューマーを作成するために使用できますが、送信と受信をアトミックな作業単位にグループ化するためのトランザクション コンテキストも提供します。
次の例に示すように、接続オブジェクトからセッションを作成できます。
Session session = connection.createSession(false, Session.CLIENT_ACKNOWLEDGE);
注
JMS API は、メッセージング・セッションが有効になっている Service Bus キューまたはトピックからのメッセージの受信をサポートしていません。
セッション モード
セッションは、次のいずれかのモードで作成できます。
セッション モード | 行動 |
---|---|
Session.AUTO_ACKNOWLEDGE | セッションは、受信する呼び出しからセッションが正常に戻ったとき、またはセッションがメッセージを正常に処理するために呼び出したメッセージ リスナーがメッセージを正常に返したときに、クライアントによるメッセージの受信を自動的に確認します。 |
Session.CLIENT_ACKNOWLEDGE | クライアントは、メッセージの受信確認メソッドを呼び出すことによって、使用されたメッセージを確認します。 |
Session.DUPS_OK_ACKNOWLEDGE | この受信確認モードでは、メッセージの遅延配信を行うよう求める指示がセッションに送られます。 |
Session.SESSION_TRANSACTED | この値は、セッションでローカル トランザクションを使用するように指定するために、Connection オブジェクトの createSession(int sessionMode) メソッドに引数として渡すことができます。 |
セッション モードが指定されていない場合、 Session.AUTO_ACKNOWLEDGE は既定で選択されます。
JMSContext
注
JMSContext は、JMS 2.0 仕様の一部として定義されています。
JMSContext は、接続オブジェクトとセッション オブジェクトによって提供される機能を組み合わせたものです。 接続ファクトリ オブジェクトから作成できます。
JMSContext context = connectionFactory.createContext();
JMSContext のモード
Session オブジェクトと同様に、JMSContext はセッション モードで説明されているのと同じ受信確認モードで作成できます。
JMSContext context = connectionFactory.createContext(JMSContext.AUTO_ACKNOWLEDGE);
モードが指定されていない場合、 JMSContext.AUTO_ACKNOWLEDGE は既定で選択されます。
JMS メッセージ プロデューサー
メッセージ プロデューサーは、JMSContext または Session を使用して作成され、送信先にメッセージを送信するために使用されるオブジェクトです。
次の例に示すように、スタンドアロン オブジェクトとして作成できます。
JMSProducer producer = context.createProducer();
または、メッセージを送信する必要があるときに実行時に作成されます。
context.createProducer().send(destination, message);
JMS メッセージ コンシューマー
メッセージ コンシューマーは、JMSContext または Session によって作成され、宛先に送信されたメッセージを受信するために使用されるオブジェクトです。 これは、次の例に示すように作成できます。
JMSConsumer consumer = context.createConsumer(dest);
receive() メソッドを介した同期受信
メッセージ コンシューマーは、 receive()
メソッドを介して送信先からメッセージを受信する同期的な方法を提供します。
引数/タイムアウトが指定されていない場合、またはタイムアウト '0' が指定されている場合、メッセージが到着しないか、接続が切断されている (どちらか早い方) 場合、コンシューマーは無期限にブロックします。
Message m = consumer.receive();
Message m = consumer.receive(0);
0 以外の正の引数を指定すると、コンシューマーはタイマーの有効期限が切れるまでブロックします。
Message m = consumer.receive(1000); // time out after one second.
JMS メッセージ リスナーを使用した非同期受信
メッセージ リスナーは、宛先でのメッセージの非同期処理に使用されるオブジェクトです。 MessageListener
インターフェイスを実装します。このインターフェイスには、特定のビジネス ロジックを実行する必要があるonMessage
メソッドが含まれています。
メッセージ リスナー オブジェクトは、 setMessageListener
メソッドを使用して、特定のメッセージ コンシューマーに対してインスタンス化および登録する必要があります。
Listener myListener = new Listener();
consumer.setMessageListener(myListener);
トピックからの使用
JMS メッセージ・コンシューマー は、 宛先 (キューまたはトピック) に対して作成されます。
キュー上のコンシューマーは、クライアント アプリケーションと Azure Service Bus の間のセッション (および接続) のコンテキストに存在する単なるクライアント側オブジェクトです。
ただし、トピックに関する消費者には 2 つの要素があります。
- Session(または JMSContext) のコンテキストに存在する クライアント側オブジェクト 。
- Azure Service Bus 上のエンティティである サブスクリプション 。
サブスクリプションは ここに 記載されており、次のいずれかになります。
- 共有の永続的サブスクリプション
- 共有の非永続的サブスクリプション
- 非共有の永続的サブスクリプション
- 非共有の非永続的サブスクリプション
JMS キュー ブラウザー
JMS API は、アプリケーションがキュー内のメッセージを参照し、各メッセージのヘッダー値を表示できるようにする QueueBrowser
オブジェクトを提供します。
キュー ブラウザーは、次の例のように JMSContext を使用して作成できます。
QueueBrowser browser = context.createBrowser(queue);
注
JMS API には、トピックを参照するための API は用意されていません。
これは、トピック自体にメッセージが格納されないためです。 メッセージがトピックに送信されるとすぐに、適切なサブスクリプションに転送されます。
JMS メッセージ セレクター
メッセージ セレクターを使用するには、アプリケーションを受信して、受信したメッセージをフィルター処理します。 メッセージ セレクターを使用すると、受信側のアプリケーションは、メッセージをフィルター処理する作業を、その役割を担うのではなく、JMS プロバイダー (この場合は Azure Service Bus) にオフロードします。
セレクターは、次のいずれかのコンシューマーを作成するときに使用できます。
- 共有永続サブスクリプション
- 非共有の永続的なサブスクリプション
- 非永続的な共有サブスクリプション
- 非共有の非永続的サブスクリプション
- キュー ブラウザー
注
Service Bus セレクターでは、"LIKE" と "BETWEEN" の SQL キーワードはサポートされていません。
AMQP のディスポジションと Service Bus 操作のマッピング
AMQP の処理が Service Bus 操作にどのように変換されるかを次に示します。
ACCEPTED = 1; -> Complete()
REJECTED = 2; -> DeadLetter()
RELEASED = 3; (just unlock the message in service bus, will then get redelivered)
MODIFIED_FAILED = 4; -> Abandon() which increases delivery count
MODIFIED_FAILED_UNDELIVERABLE = 5; -> Defer()
概要
この開発者ガイドでは、Java Message Service (JMS) を使用する Java クライアント アプリケーションが Azure Service Bus に接続する方法について説明しました。
次のステップ
Azure Service Bus の詳細と Java Message Service (JMS) エンティティの詳細については、次の記事を参照してください。