Spring Messaging Azure Service Bus に対する Spring Cloud Azure のサポート

この記事では、Spring Cloud Azure と Spring Messaging Azure Service Bus を使用する方法について説明します。 Spring Framework は、メッセージング システムとの統合を広範にサポートします。

SpringメッセージングとAzureサービスバス

重要な概念

Azure Service Bus は、メッセージ キューと、パブリッシュとサブスクライブのトピックを備えたフル マネージド エンタープライズ統合メッセージ ブローカーです。 Azure Service Bus 用 Spring Messaging プロジェクトは、Service Bus ベースのメッセージング ソリューションの開発に、Spring の主要な概念を適用します。 これは、メッセージを送信するための高度な抽象化として テンプレートを提供します。 また、@ServiceBusListener 注釈と リスナー コンテナーを使用したメッセージドリブン POJO のサポートも提供します。 これらのライブラリは、依存関係の挿入と宣言型の構成の使用を促進します。 いずれの場合も、Spring Framework の JMS サポートと Spring AMQP の RabbitMQ サポートとの類似点を確認できます。

依存関係のセットアップ

<dependency>
  <groupId>com.azure.spring</groupId>
  <artifactId>spring-cloud-azure-starter</artifactId>
</dependency>
<dependency>
  <groupId>com.azure.spring</groupId>
  <artifactId>spring-messaging-azure-servicebus</artifactId>
</dependency>

コンフィギュレーション

ライブラリには、ServiceBusTemplate と @ServiceBusListenerに関する次の構成オプションが用意されています。

プロパティ タイプ 説明
spring.cloud.azure.message-converter.isolated-object-mapper ブーリアン 分離された ObjectMapper Bean が Service Bus メッセージ コンバーターに使用されるかどうか。 既定で有効になっています。
spring.cloud.azure.servicebus.enabled ブーリアン Azure Service Bus が有効になっているかどうか。
spring.cloud.azure.servicebus.connection-string 糸 Service Bus 名前空間の接続文字列値。
spring.cloud.azure.servicebus.custom-endpoint-address 糸 Service Bus に接続するときに使用するカスタム エンドポイント アドレス。
spring.cloud.azure.servicebus.namespace 糸 Service Bus 名前空間の値。これは FQDN のプレフィックスです。 FQDN は NamespaceName.DomainName で構成する必要があります
spring.cloud.azure.servicebus.entity-type 糸 Azure Service Bus のエンティティ型。

基本的な使用方法

カスタム Service Bus メッセージ コンバータ

Service Bus メッセージ コンバーターを構成するには、次の 2 つの方法があります。

  • 既定の Service Bus メッセージ コンバーターで ObjectMapper Bean を使用するように、次のプロパティを構成します。これは、カスタム ObjectMapper Bean または Spring Boot によって管理される Bean です。

    spring:
      cloud:
        azure:
          message-converter:
            isolated-object-mapper: false
    
  • Service Bus メッセージ コンバーター Bean を直接定義します。

    @Bean
    AzureMessageConverter<ServiceBusReceivedMessage, ServiceBusMessage> serviceBusMessageConverter() {
        JsonMapper jsonMapper = JsonMapper.builder().addModule(new JavaTimeModule()).build();
        return new ServiceBusMessageConverter(jsonMapper);
    }
    

Azure Service Bus にメッセージを送信する

メッセージを送信するには、次の手順に従います。

  1. 次のいずれかの方法を使用して、資格情報の構成オプションを入力します。

    • DefaultAzureCredentialとしての資格情報の場合は、application.yml ファイルで次のプロパティを構成します。

      spring:
        cloud:
          azure:
            servicebus:
              namespace: ${AZURE_SERVICE_BUS_NAMESPACE}
              entity-type: ${AZURE_SERVICE_BUS_ENTITY_TYPE}
      
    • 接続文字列としての資格情報の場合は、application.yml ファイルで次のプロパティを構成します。

      spring:
        cloud:
          azure:
            servicebus:
              connection-string: ${AZURE_SERVICE_BUS_CONNECTION_STRING}
              entity-type: ${AZURE_SERVICE_BUS_ENTITY_TYPE}
      
    • 資格情報をマネージド ID として使用するには、application.yml ファイルで次のプロパティを構成します。

      spring:
        cloud:
          azure:
            credential:
              managed-identity-enabled: true
              client-id: ${AZURE_CLIENT_ID}
            profile:
              tenant-id: <tenant>
            servicebus:
              namespace: ${AZURE_SERVICE_BUS_NAMESPACE}
              entity-type: ${AZURE_SERVICE_BUS_ENTITY_TYPE}
      

注

tenant-idには、common、organizations、consumers、テナント ID の値を指定できます。 これらの値の詳細については、エラー AADSTS50020 - ID プロバイダーのユーザー アカウントはテナントに存在しません の 間違ったエンドポイント (個人アカウントおよび組織アカウント) セクションを参照してください。 シングルテナント アプリの変換の詳細については、「Microsoft Entra IDでのシングルテナント アプリをマルチテナントに変換する」を参照してください。

  • サービス プリンシパルとしての資格情報の場合は、application.yml ファイルで次のプロパティを構成します。

    spring:
      cloud:
        azure:
          credential:
            client-id: ${AZURE_CLIENT_ID}
            client-secret: ${AZURE_CLIENT_SECRET}
          profile:
            tenant-id: <tenant>
          servicebus:
            namespace: ${AZURE_SERVICE_BUS_NAMESPACE}
            entity-type: ${AZURE_SERVICE_BUS_ENTITY_TYPE}
    

注

tenant-idには、common、organizations、consumers、テナント ID の値を指定できます。 これらの値の詳細については、エラー AADSTS50020 - ID プロバイダーのユーザー アカウントはテナントに存在しません の 間違ったエンドポイント (個人アカウントおよび組織アカウント) セクションを参照してください。 シングルテナント アプリの変換の詳細については、「Microsoft Entra IDでのシングルテナント アプリをマルチテナントに変換する」を参照してください。

  1. ServiceBusTemplate は自動的に構成され、次の例に示すように、独自の Bean に直接自動接続できます。

    @Component
    public class MyBean {
    
        private final ServiceBusTemplate serviceBusTemplate;
    
        public MyBean(ServiceBusTemplate serviceBusTemplate) {
            this.serviceBusTemplate = serviceBusTemplate;
        }
    
        public void someMethod() {
            this.serviceBusTemplate.sendAsync('QUEUE_NAME', MessageBuilder.withPayload("Hello world").build()).subscribe();
        }
    
    }
    

Azure Service Bus からメッセージを受信する

メッセージを受信するには、次の手順に従います。

  1. 資格情報の構成オプションを入力します。

  2. @EnableAzureMessaging 注釈を追加します。これによって、@ServiceBusListenerで注釈が付けられたメソッドの検出がトリガーされ、メッセージ リスナー コンテナーが内部に作成されます。

    @SpringBootApplication
    @EnableAzureMessaging
    public class DemoApplication {
        public static void main(String[] args) {
            SpringApplication.run(DemoApplication.class, args);
        }
    }
    

    注

    重複を避けるため、バージョン 5.21.0 以降、Spring Cloud Azure Auto-configure ではアノテーション @EnableAzureMessaging が自動的に有効になります。

  3. ServiceBus インフラストラクチャが存在する場合は、@ServiceBusListener を使用して任意の Bean に注釈を付けてリスナー エンドポイントを作成できます。 次のコンポーネントは、QUEUE_NAME キューにリスナー エンドポイントを作成します。

    @Component
    public class MyBean {
    
        @ServiceBusListener(destination = "QUEUE_NAME")
        public void processMessage(String content) {
            // ...
        }
    
    }
    

Service Bus クライアントのプロパティをカスタマイズする

開発者は、AzureServiceClientBuilderCustomizer を使用して Service Bus クライアントのプロパティをカスタマイズできます。 次の例では、sessionIdleTimeoutの ServiceBusClientBuilder プロパティをカスタマイズします。

@Bean
public AzureServiceClientBuilderCustomizer<ServiceBusClientBuilder.ServiceBusSessionProcessorClientBuilder> customizeBuilder() {
    return builder -> builder.sessionIdleTimeout(Duration.ofSeconds(10));
}

サンプル

詳細については、GitHub の azure-spring-boot-samples リポジトリを参照してください。