Spring で JMS を使用して Azure Service Bus にアクセスする
このチュートリアルでは、Azure Service Bus JMS 用 Spring Boot Starter を使用して、Service Bus の queues
および topics
との間でメッセージを送受信する方法について説明します。
Azure には、Azure Service Bus ("Service Bus") という、Advanced Message Queueing Protocol 1.0 ("AMQP 1.0") 標準に基づいた非同期のメッセージング プラットフォームが用意されています。 Service Bus は、サポートされている Azure プラットフォームの範囲全体で使用することができます。
Azure Service Bus JMS 用の Spring Boot スターターを使用すると、Spring JMS と Service Bus を統合することができます。
次のビデオでは、JMS 2.0 を使用して、Spring JMS アプリケーションを Azure Service Bus と統合する方法について説明します。
このチュートリアルでは、Microsoft Entra 認証と Shared Access Signature (SAS) 認証の 2 つの認証が含まれます。 [パスワードレス] タブには Microsoft Entra 認証が表示され、[接続文字列] タブには SAS 認証が表示されます。
Microsoft Entra 認証は、Microsoft Entra ID で定義された ID を使用して Azure Service Bus JMS に接続するメカニズムです。 Microsoft Entra 認証を使用すると、データベース ユーザーの ID や他の Microsoft サービスを一元管理でき、アクセス許可の管理が容易になります。
SAS 認証では、Service Bus JMS への委任されたアクセスに Azure Service Bus 名前空間の接続文字列が使用されます。 Shared Access Signature を資格情報として使用する場合は、接続文字列を自分で管理する必要があります。
前提条件
Azure サブスクリプション - 無料アカウントを作成します。
Java Development Kit (JDK) バージョン 8 以降。
Apache Maven、バージョン 3.2 以降。
Azure Service Bus のキューまたはトピック。 お持ちでない場合は、「Azure Portal を使用して Service Bus 名前空間とキューを作成する」または「Azure Portal を使用して Service Bus トピックとトピック のサブスクリプションを作成する」を参照してください。
Spring Boot アプリケーション。 ない場合は、Spring Initializr で Maven プロジェクトを作成します。 必ず、[Maven プロジェクト] を選択し、[依存関係] に [Spring Web] 依存関係を追加してから、Java のバージョン 8 以降を選択してください。
重要
このチュートリアルの手順を完了するには、Spring Boot 2.5 以上のバージョンが必要です。
Azure Service Bus からメッセージを送受信する
Azure Service Bus のキューまたはトピックを使用すると、Spring Cloud Azure Service Bus JMS を使用してメッセージを送受信できます。
Spring Cloud Azure Service Bus JMS Starter モジュールをインストールするには、次の依存関係を pom.xml ファイルに追加します。
Spring Cloud Azure 部品表 (BOM):
<dependencyManagement> <dependencies> <dependency> <groupId>com.azure.spring</groupId> <artifactId>spring-cloud-azure-dependencies</artifactId> <version>5.18.0</version> <type>pom</type> <scope>import</scope> </dependency> </dependencies> </dependencyManagement>
Note
Spring Boot 2.xを使用している場合は、
spring-cloud-azure-dependencies
バージョンを4.19.0
に設定してください。 この部品表(BOM)は、 pom.xml ファイルの<dependencyManagement>
セクションで設定する必要があります。 これにより、すべてのSpring Cloud Azure依存関係が同じバージョンを使用していることが保証されます。 このBOMに使用されるバージョンの詳細については、「Spring Cloud Azureのどのバージョンを使うべきか」を参照してください。Spring Cloud Azure Service Bus JMS Starter アーティファクト:
<dependency> <groupId>com.azure.spring</groupId> <artifactId>spring-cloud-azure-starter-servicebus-jms</artifactId> </dependency>
アプリケーションをコーディングする
次の手順を実行して、Service Bus キューまたはトピックを使用してメッセージを送受信するようにアプリケーションを構成します。
次のプロパティを application.properties ファイルに追加して、Service Bus の資格情報を構成します。
Note
Azure Service Bus JMS では、Microsoft Entra ID を使用して Service Bus リソースへの要求を承認できます。 Microsoft Entra ID では、Azure ロールベースのアクセス制御 (Azure RBAC) を使用して、セキュリティ プリンシパルへのアクセスを許可します (これは、ユーザーまたはアプリケーション サービス プリンシパルである場合があります)。
重要
開始する前に、現在使用している Microsoft Entra アカウントに Azure Service Bus Data Owner ロールが割り当てられていることを確認します。 詳細については、Azure portal を使用して Azure ロールを割り当てる方法に関するページを参照してください。
spring.jms.servicebus.namespace=<ServiceBusNamespace> spring.jms.servicebus.pricing-tier=<ServiceBusPricingTier> spring.jms.servicebus.passwordless-enabled=true spring.jms.listener.receive-timeout=60000
次の表では、構成のフィールドについて説明します。
フィールド 説明 spring.jms.servicebus.namespace
Azure Portal の Service Bus サービス インスタンスで取得した名前空間を指定します。 spring.jms.servicebus.pricing-tier
Service Bus の価格レベルを指定します。 サポートされる値はプレミアムおよび標準です。 プレミアムティアはJava Message Service(JMS)2.0を使用し、標準ティアはJMS 1.1を使用してAzure Service Busと対話します。 spring.jms.servicebus.passwordless-enabled
パスワードレスを使用するかどうかを指定します。 spring.jms.listener.receive-timeout
デフォルトでは、受信タイムアウト値は 1000 です。 これは、60000 に設定することが推奨されます。 @EnableJms
を追加して、JMS リスナー注釈付きエンドポイントのサポートを有効にします。 次の例に示すように、JmsTemplate
を使用してメッセージを送信し、@JmsListener
を使用してメッセージを受信します。import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; import org.springframework.jms.annotation.EnableJms; import org.springframework.boot.CommandLineRunner; import org.springframework.jms.annotation.JmsListener; import org.springframework.jms.core.JmsTemplate; @SpringBootApplication @EnableJms public class ServiceBusJMSQueueApplication implements CommandLineRunner { private static final Logger LOGGER = LoggerFactory.getLogger(ServiceBusJMSQueueApplication.class); private static final String QUEUE_NAME = "<QueueName>"; @Autowired private JmsTemplate jmsTemplate; public static void main(String[] args) { SpringApplication.run(ServiceBusJMSQueueApplication.class, args); } @Override public void run(String... args) { LOGGER.info("Sending message"); jmsTemplate.convertAndSend(QUEUE_NAME, "Hello World"); } @JmsListener(destination = QUEUE_NAME, containerFactory = "jmsListenerContainerFactory") public void receiveMessage(String message) { LOGGER.info("Message received: {}", message); } }
<QueueName>
は、自分の Service Bus 名前空間に構成されている実際のキュー名に置き換えてください。ヒント
このチュートリアルでは、構成またはコードに認証操作はありません。 ただし、Azure サービスに接続するには認証が必要です。 認証を完了するには、Azure ID を使用する必要があります。 Spring Cloud Azure では、
DefaultAzureCredential
を使用します。これは、コードを変更せずに資格情報を取得できるようにするために、Azure ID ライブラリで提供されます。DefaultAzureCredential
は複数の認証方法をサポートしており、実行時に使用する方法が決定されます。 このアプローチを採用すると、環境固有のコードを実装することなく、異なる環境 (ローカルと運用環境など) で異なる認証方法をアプリに使用できます。 詳細については、DefaultAzureCredential を参照してください。ローカル開発環境で認証を完了するには、Azure CLI、Visual Studio Code、PowerShell、またはその他の方法を使用できます。 詳細については、「Java 開発環境での Azure 認証」を参照してください。 Azure ホスティング環境で認証を完了するには、ユーザー割り当てマネージド ID を使用することをお勧めします。 詳細については、「Azure リソースのマネージド ID とは」を参照してください。
アプリケーションを起動します。 次の出力例に示すように、アプリケーション ログに投稿された
Sending message
とHello World
が表示されます。Sending message Message received: Hello World
Azure Spring Apps にデプロイする
Spring Boot アプリケーションがローカルで実行されたので、運用環境に移行します。 Azure Spring Apps では、コードを変更せずに、Spring Boot アプリケーションを Azure に簡単にデプロイできます。 Spring アプリケーションのインフラストラクチャはこのサービスによって管理されるため、開発者はコードに専念できます。 Azure Spring Apps では、包括的な監視と診断、構成管理、サービス検出、CI/CD 統合、ブルー/グリーン デプロイなどを使用して、ライフサイクルを管理できます。 Azure Spring Apps にアプリケーションをデプロイするには、「初めてのアプリケーションを Azure Spring Apps にデプロイする」を参照してください。