Azure Service Bus JMS 2.0 開発者ガイド
このガイドでは、Java Message Service (JMS) 2.0 API を使用して Azure Service Bus との通信を成功させるために役立つ詳細情報を紹介します。
Java 開発者として Azure Service Bus を初めて使用する場合、以下の記事をお読みください。
作業の開始 | 概念 |
---|---|
Java Message Service (JMS) プログラミング モデル
以下のセクションは、Java Message Service API プログラミング モデルの概要を示したものです。
Note
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) 用の Oracle JAVA EE 6 チュートリアル)」を出典としたものです
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);
Note
JMS API では、メッセージング セッションを有効にして Service Bus キューまたはトピックからメッセージを受信できません。
セッション モード
セッションは、以下のいずれかのモードで作成できます。
セッション モード | 動作 |
---|---|
Session.AUTO_ACKNOWLEDGE | 受信の呼び出しからセッションが正常に返されたとき、またはメッセージを処理するためにセッションが呼び出したメッセージ リスナーが正常に返されたときに、クライアントのメッセージ受信がセッションによって自動的に確認されます。 |
Session.CLIENT_ACKNOWLEDGE | メッセージの確認メソッドを呼び出すことにより、使用されたメッセージがクライアントによって確認されます。 |
Session.DUPS_OK_ACKNOWLEDGE | この受信確認モードでは、メッセージの遅延配信を行うよう求める指示がセッションに送られます。 |
Session.SESSION_TRANSACTED | この値は、セッションでローカル トランザクションを使用することを指定するために、接続オブジェクトのメソッド createSession(int sessionMode) に、引数として渡すことができます。 |
セッション モードが指定されていない場合、既定では Session.AUTO_ACKNOWLEDGE が選択されます。
JMSContext
Note
JMSContext は、JMS 2.0 仕様の一部として定義されています。
JMSContext は、接続とセッション オブジェクトによって提供される機能を組み合わせたものです。 これは、接続ファクトリ オブジェクトから作成できます。
JMSContext context = connectionFactory.createContext();
JMSContext のモード
JMSContext は、Session オブジェクトと同様、「セッション モード」で説明されているのと同じ受信確認モードで作成できます。
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 メッセージ リスナーを使用した非同期受信
メッセージ リスナーは、送信先でメッセージを非同期的に処理するために使用されるオブジェクトです。 特定のビジネス ロジックが存在する必要がある onMessage
メソッドを含んだ、MessageListener
インターフェイスを実装しています。
メッセージ リスナー オブジェクトは、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);
Note
JMS API では、トピックを参照するための API は提供されていません。
これは、トピック自体にメッセージが格納されていないためです。 メッセージは、トピックに送信されるとすぐに、適切なサブスクリプションへと転送されます。
JMS メッセージ セレクター
メッセージ セレクターは、受信したメッセージをフィルター処理するために、受信側アプリケーションによって使用されます。 メッセージ セレクターを使用した場合、受信側アプリケーションはメッセージのフィルター処理を自身で実行するのではなく、JMS プロバイダー (この場合は Azure Service Bus) に処理をオフロードします。
セレクターは、以下のいずれかのコンシューマーを作成するときに使用できます。
- 共有の永続的サブスクリプション
- 非共有の永続的サブスクリプション
- 共有の非永続的サブスクリプション
- 非共有の非永続的サブスクリプション
- キュー ブラウザー
AMQP の disposition と Service Bus 操作のマッピング
AMQP の disposition が 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) エンティティの詳細については、以下の記事を参照してください。