この記事では、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 |
JMS 自動構成Service Bus有効にするかどうかを示す値。 既定値は 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 |
接続が要求され、プールがいっぱいになったときにブロックするかどうかを示す値。 代わりに JMSException をスローするには、false に設定します。 |
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 ポータル>使用して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
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 |
手記
次の表は、spring.jms.servicebus.pool.enabled と spring.jms.cache.enabled の両方が異なる Spring Cloud Azure バージョンに対して設定されていない場合の既定のConnectionFactoryを示しています。
| Spring Cloud Azure バージョン | 送信者 ConnectionFactory |
リスナー コンテナー ConnectionFactory |
|---|---|---|
| >= 6.2.0 または >= 7.2.0 | CachingConnectionFactory |
ServiceBusJmsConnectionFactory |
| 6.1.0 と 7.0.0 | ServiceBusJmsConnectionFactory |
ServiceBusJmsConnectionFactory |
| <= 6.1.0 | JmsPoolConnectionFactory |
JmsPoolConnectionFactory |
サンプル
詳細については、GitHubの azure-spring-boot-samples リポジトリを参照してください。