JMS でAzure Service Busを使用する

この記事では、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では、まず、アプリケーション認証の構成に応じて、次のいずれかの種類の資格情報を構築します。

  • ClientSecretCredential
  • ClientCertificateCredential
  • UsernamePasswordCredential
  • ManagedIdentityCredential

これらの種類の資格情報が見つからない場合は、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価格レベル。 サポートされている値は、premiumstandardです。 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に接続する

  1. マネージド ID を使用するには、サービスのマネージド ID を有効にして、Azure Service Bus Data Owner ロールを割り当てます。 詳細については、「Azure Service Bus リソースにアクセスするためのMicrosoft Entra IDを使用してマネージド ID を認証するを参照してください。

  2. 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.2.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

手記

次の表は、spring.jms.servicebus.pool.enabledspring.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 リポジトリを参照してください。