この記事では、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 メッセージ コンバーターで
ObjectMapperBean を使用するように、次のプロパティを構成します。これは、カスタムObjectMapperBean または Spring Boot によって管理される Bean です。spring: cloud: azure: message-converter: isolated-object-mapper: falseService Bus メッセージ コンバーター Bean を直接定義します。
@Bean AzureMessageConverter<ServiceBusReceivedMessage, ServiceBusMessage> serviceBusMessageConverter() { JsonMapper jsonMapper = JsonMapper.builder().addModule(new JavaTimeModule()).build(); return new ServiceBusMessageConverter(jsonMapper); }
Azure Service Bus にメッセージを送信する
メッセージを送信するには、次の手順に従います。
次のいずれかの方法を使用して、資格情報の構成オプションを入力します。
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でのシングルテナント アプリをマルチテナントに変換する」を参照してください。
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 からメッセージを受信する
メッセージを受信するには、次の手順に従います。
資格情報の構成オプションを入力します。
@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が自動的に有効になります。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 リポジトリを参照してください。