JMS で Azure Service Bus を使用する
この記事は、✅ バージョン 4.19.0 ✅ バージョン 5.19.0 に適用されます。
この記事では、Spring JMS フレームワークに統合された JMS API で Azure Service Bus を使用する方法について説明します。
コア機能
パスワードレス接続
パスワードレス接続では、アプリケーション、その構成ファイル、または環境変数に資格情報を格納せずに Azure サービスに接続するために Microsoft Entra 認証が使用されます。 Microsoft Entra 認証は、Microsoft Entra ID で定義されている ID を使用して Azure Service Bus に接続するためのメカニズムです。 Microsoft Entra 認証を使用すると、Service Bus やその他の Microsoft サービスを中央の場所で管理できるため、アクセス許可の管理が簡素化されます。
しくみ
Spring Cloud Azure では、まず、アプリケーション認証の構成に応じて、次のいずれかの種類の資格情報を構築します。
ClientSecretCredential
ClientCertificateCredential
UsernamePasswordCredential
ManagedIdentityCredential
これらの種類の資格情報が見つからない場合は、DefaultTokenCredential
経由の資格情報チェーンを使用して、アプリケーションのプロパティ、環境変数、マネージド ID、または IDE から資格情報を取得します。 詳細については、Spring Cloud Azure 認証
依存関係のセットアップ
Spring JMS アプリケーションを移行して Azure Service Bus を使用する場合は、次の依存関係を追加します。
<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 対応 |
Azure Service Bus JMS のパスワードレスを有効にするかどうか。 既定値は false です。 |
spring.jms.servicebus.pricing-tier を |
Azure Service Bus の価格レベル。 サポートされている値は、Premium と標準 |
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 を |
通常の ConnectionFactory ではなく、JmsPoolConnectionFactory を作成するかどうかを示す値。 |
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
ロールを割り当てます。 詳細については、「Microsoft Entra ID を使用してマネージド ID を認証して、Azure Service Bus リソースにアクセスする」を参照してください。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}
コネ
Spring Cloud Azure には、Azure Service Bus JMS に接続するための次の 3 つの接続ファクトリ オプションが用意されています。
JmsPoolConnectionFactory
:spring.jms.servicebus.pool.enabled=true
を設定するか、プールとキャッシュの両方の設定を未設定のままにして既定値を使用します。 このファクトリは、spring.jms.servicebus.pool.max-connections
などのカスタマイズ可能なオプションを持つ接続プールを維持します。 追加のプール構成設定 (プレフィックスはspring.jms.servicebus.pool.
) については、「構成」セクションで詳しく説明します。 このセットアップでは、Azure Service Bus の負荷分散機能を利用し、複数のエンドポイントにトラフィックを分散することで、パフォーマンスが向上します。CachingConnectionFactory
:spring.jms.cache.enabled=true
を設定し、spring.jms.servicebus.pool.enabled
設定を解除したままにしておきます。 このファクトリは、JmsTemplate
のすべての呼び出しに対して 1 つの接続を再利用し、トラフィックの少ないシナリオに最適な接続の作成のオーバーヘッドを削減します。 ただし、このモードでは、Azure Service Bus の負荷分散機能は利用されません。ServiceBusJmsConnectionFactory
: プールやキャッシュを使用せず、ServiceBusJmsConnectionFactory
を直接使用するようにspring.jms.servicebus.pool.enabled=false
とspring.jms.cache.enabled=false
を設定します。 このモードでは、JmsTemplate
を呼び出すたびに新しい接続が作成されます。これは、リソースを集中的に消費し、効率が低下する可能性があります。
最適なパフォーマンスと負荷分散を実現するために、spring.jms.servicebus.pool.enabled=true
を設定して JmsPoolConnectionFactory
を使用することをお勧めします。
CachingConnectionFactory
または ServiceBusJmsConnectionFactory
で JmsPoolConnectionFactory
をラップすることは避けてください。これは、プールの利点を否定し、プールから削除された後に非アクティブな接続を保持する可能性があるためです。
手記
Spring Cloud Azure 5.19.0 以降では、Service Bus サーバーの負荷分散をより適切に使用するために、既定の ConnectionFactory
が JmsPoolConnectionFactory
に更新されました。
Session
と MessageProducer
の両方をキャッシュするために CachingConnectionFactory
を引き続き使用する場合は、spring.jms.cache.enabled
を true
に設定します。
サンプル
詳細については、GitHub の azure-spring-boot-samples リポジトリ