この記事では、Spring JMS フレームワークに統合された JMS API でAzure Service Busを使用する方法について説明します。
コア機能
パスワードレス接続
パスワードレス接続では、Microsoft Entra認証を使用して、アプリケーション、その構成ファイル、または環境変数に資格情報を格納せずに、Azure サービスに接続します。 Microsoft Entra認証は、Microsoft Entra IDで定義された ID を使用してAzure Service Busに接続するためのメカニズムです。 Microsoft Entra認証を使用すると、一元的な場所でService Busやその他のMicrosoft サービスを管理できるため、アクセス許可の管理が簡素化されます。
しくみ
Spring Cloud Azureでは、まず、アプリケーション認証の構成に応じて、次のいずれかの種類の資格情報を構築します。
ClientSecretCredentialClientCertificateCredentialUsernamePasswordCredentialManagedIdentityCredential
これらの種類の資格情報が見つからない場合は、DefaultTokenCredential 経由の資格情報チェーンを使用して、アプリケーションのプロパティ、環境変数、マネージド ID、または IDE から資格情報を取得します。 詳細については、「Spring Cloud Azure 認証」を参照>。
依存関係のセットアップ
Azure Service Busを使用するように Spring JMS アプリケーションを移行する場合は、次の依存関係を追加します。
<dependency>
<groupId>com.azure.spring</groupId>
<artifactId>spring-cloud-azure-starter-servicebus-jms</artifactId>
</dependency>
構成
次の表では、Spring JMS サポートを使用する場合の構成可能なプロパティについて説明します。
| 財産 | 説明 |
|---|---|
spring.jms.servicebus.connection-string |
接続文字列を直接指定する場合に使用する、Azure Service Bus の接続文字列。 |
spring.jms.servicebus.topic-client-id |
JMS クライアント ID。
topicJmsListenerContainerFactory Bean に対してのみ機能します。 |
spring.jms.servicebus.enabled |
Service Bus の JMS 自動構成を有効にするかどうかを示す値。 既定値は trueです。 |
spring.jms.servicebus.idle-timeout |
メッセージが配信されないときに、Service Bus が接続を維持するとクライアントが想定する時間を示す接続アイドル タイムアウト期間。 既定値は 2mです。 |
spring.jms.servicebus.passwordless-enabled |
Azure Service Bus JMS に対してパスワードレスを有効にするかどうか。 既定値は falseです。 |
spring.jms.servicebus.pricing-tier |
Azure Service Bus の料金レベル。 サポートされている値は、premium と standardです。 Premium レベルでは Java Message Service (JMS) 2.0 を使用し、Standard レベルでは JMS 1.1 を使用してAzure Service Busを操作します。 |
spring.jms.servicebus.listener.reply-pub-sub-domain |
応答先の種類がトピックかどうかを示す値。
topicJmsListenerContainerFactory Bean に対してのみ機能します。 |
spring.jms.servicebus.listener.phase |
このコンテナーを開始および停止する必要があるフェーズ。 |
spring.jms.servicebus.listener.reply-qos-settings |
返信を送信するときに使用する QosSettings を構成します。 |
spring.jms.servicebus.listener.subscription-durable |
サブスクリプションを永続的にするかどうかを示す値。
topicJmsListenerContainerFactory Bean に対してのみ機能します。 既定値は trueです。 |
spring.jms.servicebus.listener.subscription-shared |
サブスクリプションを共有するかどうかを示す値。
topicJmsListenerContainerFactory Bean に対してのみ機能します。 |
spring.jms.servicebus.pool.block-if-full |
接続が要求され、プールがいっぱいになったときにブロックするかどうかを示す値。 これを false に設定すると、代わりに JMSException をスローします。 |
spring.jms.servicebus.pool.block-if-full-timeout |
プールがいっぱいの場合に例外をスローする前のブロック期間。 |
spring.jms.servicebus.pool.enabled |
通常の JmsPoolConnectionFactoryではなく、ConnectionFactory を作成するかどうかを示す値。 |
spring.jms.servicebus.pool.idle-timeout |
接続プールのアイドル タイムアウト。 |
spring.jms.servicebus.pool.max-connections |
コネクションプール内の最大接続数。 |
spring.jms.servicebus.pool.max-sessions-per-connection |
プール内の接続あたりのプールされたセッションの最大数。 |
spring.jms.servicebus.pool.time-between-expiration-check |
アイドル接続削除スレッドの各実行の間の待機時間。 値が負の場合、アイドル接続を切断するスレッドは実行されません。 |
spring.jms.servicebus.pool.use-anonymous-producers |
匿名 MessageProducer インスタンスを 1 つだけ使用するかどうかを示す値。
false に設定して、必要なたびに 1 つの MessageProducer を作成します。 |
spring.jms.servicebus.prefetch-policy.all |
このService Bus名前空間のプリフェッチ オプションのフォールバック値。 既定値は 0です。 |
spring.jms.servicebus.prefetch-policy.durable-topic-prefetch |
永続トピックのプリフェッチの数。 既定値は 0です。 |
spring.jms.servicebus.prefetch-policy.queue-browser-prefetch |
キューブラウザーのプリフェッチ数。 既定値は 0です。 |
spring.jms.servicebus.prefetch-policy.queue-prefetch |
キューのプリフェッチ数。 既定値は 0です。 |
spring.jms.servicebus.prefetch-policy.topic-prefetch |
トピックのプリフェッチの数。 既定値は 0です。 |
手記
Spring JMS の一般的な構成は省略されています。
詳細については、Spring JMS ドキュメント
基本的な使用方法
パスワードレスを使用して Azure Service Bus JMS に接続する
application.yml ファイルで次のプロパティを構成します。
spring:
jms:
servicebus:
namespace: ${AZURE_SERVICEBUS_NAMESPACE}
pricing-tier: ${PRICING_TIER}
passwordless-enabled: true
重要
Azure Service Bus JMS は、Microsoft Entra ID を使用した Service Bus リソースへの要求の承認をサポートしています。 Microsoft Entra IDでは、現在使用しているMicrosoft Entra アカウントに Azure Service Bus データ所有者 ロールが割り当てられていることを確認します。 詳細については、Azure portal を使用して Azure ロールを割り当てるを参照してください。
JMS でマネージド ID を使用してAzure Service Busに接続する
マネージド ID を使用するには、サービスのマネージド ID を有効にして、
Azure Service Bus Data Ownerロールを割り当てます。 詳細については、「Azure Service Bus リソースにアクセスするためのMicrosoft Entra IDを使用してマネージド ID を認証するを参照してください。application.yml ファイルで次のプロパティを構成します。
spring: cloud: azure: credential: managed-identity-enabled: true jms: servicebus: namespace: ${AZURE_SERVICEBUS_NAMESPACE} pricing-tier: ${PRICING_TIER} passwordless-enabled: true重要
ユーザー割り当てマネージド ID を使用している場合は、ユーザー割り当てマネージド ID クライアント ID を持つプロパティ
spring.cloud.azure.credential.client-idも追加する必要があります。
接続文字列 を使用して Azure Service Bus JMS に接続する
次のプロパティを追加すれば、準備完了です。
spring:
jms:
servicebus:
connection-string: ${AZURE_SERVICEBUS_CONNECTION_STRING}
pricing-tier: ${PRICING_TIER}
手記
Microsoftでは、使用可能な最も安全な認証フローを使用することをお勧めします。 この手順で説明されている認証フロー (データベース、キャッシュ、メッセージング、AI サービスなど) には、アプリケーションで非常に高い信頼度が要求されるため、他のフローには存在しないリスクが伴います。 このフローは、パスワードレス接続またはキーレス接続のマネージド ID など、より安全なオプションが有効でない場合にのみ使用します。 ローカル コンピューターの操作では、パスワードレス接続またはキーレス接続にユーザー ID を使用します。
コネ
Spring Cloud Azure には、Azure Service Bus JMS に接続するための次の 3 つの接続ファクトリ オプションが用意されています。
JmsPoolConnectionFactory:このファクトリは、spring.jms.servicebus.pool.max-connectionsなどのカスタマイズ可能なオプションを持つ接続プールを維持します。 その他のプール構成設定 (プレフィックスはspring.jms.servicebus.pool.) については、「 構成」 セクションで詳しく説明します。 このセットアップでは、Azure Service Busの負荷分散機能を使用して、複数のエンドポイントにトラフィックを分散することで、パフォーマンスが向上します。CachingConnectionFactory: このファクトリは、JmsTemplateへのすべての呼び出しに対して 1 つの接続を再利用するため、トラフィックの少ないシナリオに最適な接続作成のオーバーヘッドが削減されます。 ただし、このモードでは、Azure Service Busの負荷分散機能は使用されません。ServiceBusJmsConnectionFactory: このモードでは、JmsTemplateを呼び出すたびに新しい接続が作成されます。これは、リソースを集中的に消費し、効率が低下する可能性があります。
クラスパスに 3 つのクラスがすべて存在する場合、どれが使用されますか? 次の表では、構成プロパティ (Spring Cloud Azure 7.1.0 および 6.2.0 以降) に基づいて使用される内容について説明します。
spring.jms.servicebus.pool.enabled |
spring.jms.cache.enabled |
送信者 ConnectionFactory |
リスナー コンテナー ConnectionFactory |
|---|---|---|---|
| 設定しない | 設定しない | CachingConnectionFactory |
ServiceBusJmsConnectionFactory |
| 設定しない | true |
CachingConnectionFactory |
CachingConnectionFactory |
| 設定しない | false |
ServiceBusJmsConnectionFactory |
ServiceBusJmsConnectionFactory |
true |
設定しない | JmsPoolConnectionFactory |
JmsPoolConnectionFactory |
true |
true |
CachingConnectionFactory |
CachingConnectionFactory |
true |
false |
JmsPoolConnectionFactory |
JmsPoolConnectionFactory |
false |
設定しない | CachingConnectionFactory |
ServiceBusJmsConnectionFactory |
false |
true |
CachingConnectionFactory |
CachingConnectionFactory |
false |
false |
ServiceBusJmsConnectionFactory |
ServiceBusJmsConnectionFactory |
手記
次の表は、ConnectionFactory と spring.jms.servicebus.pool.enabled の両方が異なる Spring Cloud Azure バージョンに対して設定されていない場合の既定のspring.jms.cache.enabledを示しています。
| Spring Cloud Azure バージョン | 送信者 ConnectionFactory |
リスナー コンテナー ConnectionFactory |
|---|---|---|
| >= 6.2.0 または >= 7.1.0 | CachingConnectionFactory |
ServiceBusJmsConnectionFactory |
| 6.1.0 と 7.0.0 | ServiceBusJmsConnectionFactory |
ServiceBusJmsConnectionFactory |
| <= 6.1.0 | JmsPoolConnectionFactory |
JmsPoolConnectionFactory |
サンプル
詳細については、GitHubの azure-spring-boot-samples リポジトリを参照してください。