既存の Java Message Service (JMS) 2.0 アプリケーションを Apache ActiveMQ から Azure Service Bus に移行する

この記事では、JMS ブローカーを操作する既存の Java Message Service (JMS) 2.0 アプリケーションを変更して、代わりに Azure Service Bus を操作する方法について説明します。 具体的には、Apache ActiveMQ または Amazon MQ から移行する方法について説明します。

Azure Service Bus では、Advanced Message Queuing Protocol (AMQP) を介して JMS 2.0 API を使用する Java 2 Platform, Enterprise Edition および Spring のワークロードがサポートされています。

開始する前に

Azure Service Bus と Apache ActiveMQ との相違点

Azure Service Bus と Apache ActiveMQ は両方とも、クライアント アプリケーションがメッセージを送受信するための JMS プロバイダーとして機能するメッセージ ブローカーです。 どちらの場合も、キューでのポイントツーポイント セマンティクスと、トピックおよびサブスクリプションでのパブリッシュ/サブスクライブ セマンティクスが有効になります。

それでも、次の表に示すように、両者にはいくつかの違いがあります。

カテゴリ ActiveMQ Azure Service Bus
アプリケーションの階層化 クラスター化モノリス 2 層
(ゲートウェイ + バックエンド)
プロトコルのサポート
  • AMQP
  • STOMP
  • OpenWire
AMQP
プロビジョニング モード
  • サービスとしてのインフラストラクチャ (IaaS)、オンプレミス
  • Amazon MQ (マネージド PaaS)
マネージド PaaS (サービスとしてのプラットフォーム)
メッセージ サイズ ユーザーが構成可能 100 MB (Premium レベル)
高可用性 お客様による管理 プラットフォーム管理
障害復旧 お客様による管理 プラットフォーム管理

現在サポートされている機能とサポートされていない機能

次の表は、現在 Azure Service Bus でサポートされている Java Message Service (JMS) 機能の一覧を示しています。 また、サポートされていない機能も示しています。

機能 API Status
キュー
  • JMSContext.createQueue(String queueName)
サポートあり
トピック
  • JMSContext.createTopic(String topicName)
サポートあり
一時キュー
  • JMSContext.createTemporaryQueue()
サポートあり
一時トピック
  • JMSContext.createTemporaryTopic()
サポートあり
メッセージ プロデューサー/
JMSProducer
  • JMSContext.createProducer()
サポートあり
キュー ブラウザー
  • JMSContext.createBrowser(Queue queue)
  • JMSContext.createBrowser(Queue queue, String messageSelector)
サポートあり
メッセージ コンシューマー/
JMSConsumer
  • JMSContext.createConsumer(Destination destination)
  • JMSContext.createConsumer(Destination destination, String messageSelector)
  • JMSContext.createConsumer(Destination destination, String messageSelector, boolean noLocal)

noLocal は現在サポートされていません。
サポートされています
共有の永続的サブスクリプション
  • JMSContext.createSharedDurableConsumer(Topic topic, String name)
  • JMSContext.createSharedDurableConsumer(Topic topic, String name, String messageSelector)
サポートあり
非共有の永続的サブスクリプション
  • JMSContext.createDurableConsumer(Topic topic, String name)
  • createDurableConsumer(Topic topic, String name, String messageSelector, boolean noLocal)

noLocal は現在サポートされていません。False に設定する必要があります
サポートされています
共有の非永続的サブスクリプション
  • JMSContext.createSharedConsumer(Topic topic, String sharedSubscriptionName)
  • JMSContext.createSharedConsumer(Topic topic, String sharedSubscriptionName, String messageSelector)
サポートあり
非共有の非永続的サブスクリプション
  • JMSContext.createConsumer(Destination destination)
  • JMSContext.createConsumer(Destination destination, String messageSelector)
  • JMSContext.createConsumer(Destination destination, String messageSelector, boolean noLocal)

noLocal は現在サポートされていません。False に設定する必要があります
サポートされています
メッセージ セレクター 作成されるコンシューマーによって異なります サポートされています
配信の遅延 (スケジュール済みメッセージ)
  • JMSProducer.setDeliveryDelay( long deliveryDelay)
サポートあり
メッセージの作成
  • JMSContext.createMessage()
  • JMSContext.createBytesMessage()
  • JMSContext.createMapMessage()
  • JMSContext.createObjectMessage(Serializable object)
  • JMSContext.createStreamMessage()
  • JMSContext.createTextMessage()
  • JMSContext.createTextMessage(String text)
サポートあり
エンティティ間トランザクション
  • Connection.createSession(true, Session.SESSION_TRANSACTED)
サポートあり
分散トランザクション サポートなし

考慮事項

2 層を持つという Azure Service Bus の性質によって、さまざまな事業継続機能 (高可用性とディザスター リカバリー) が提供されます。 ただし、JMS 機能を使用する際には、いくつかの点を考慮する必要があります。

サービスのアップグレード

Service Bus をアップグレードおよび再起動すると、一時キューまたはトピックが削除されます。 アプリケーションが一時キューまたはトピックのデータ損失の影響を受ける場合は、一時キューおよびトピックを使用しないでください。 代わりに、永続キュー、トピック、およびサブスクリプションを使用してください。

データ移行

Azure Service Bus を操作するためのクライアント アプリケーションを移行および変更した場合でも、ActiveMQ に保持されているデータは Service Bus には移行されません。 ActiveMQ のキュー、トピック、およびサブスクリプションをドレインし、メッセージを Service Bus のキュー、トピック、およびサブスクリプションに再生する際に、カスタム アプリケーションが必要になる場合があります。

認証と権限承認

Microsoft Entra ID によってサポートされる Azure ロールベースのアクセス制御 (Azure RBAC) は、Service Bus の推奨される認証メカニズムです。 ロールベースのアクセス制御を有効にするには、Azure Service Bus JMS 2.0 開発者ガイドの手順に従ってください。

移行前

バージョン チェック

JMS アプリケーションの作成時には、次のコンポーネントとバージョンを使用します。

コンポーネント Version
Java Message Service (JMS) API 1.1 以上
AMQP プロトコル 1.0

AMQP ポートが開いていることを確認する

Service Bus では、AMQP プロトコルを介した通信がサポートされます。 このためには、ポート 5671 (AMQP) と 443 (TCP) を介した通信を有効にします。 クライアント アプリケーションがホストされている場所によっては、これらのポートを介した通信を許可するためのサポート チケットが必要になる場合があります。

重要

Service Bus では、AMQP 1.0 プロトコルのみがサポートされています。

エンタープライズ構成を設定する

Service Bus によって、さまざまなエンタープライズ セキュリティおよび高可用性機能が有効になります。 詳細については、次を参照してください。

監視、アラート、トレース

Service Bus 名前空間ごとに、Azure Monitor にメトリックを発行します。 これらのメトリックを使用して、名前空間に割り当てられたリソースのアラートと動的スケーリングを行うことができます。

さまざまなメトリックの詳細と、それらに対するアラートの設定方法については、「Azure Monitor での Service Bus メトリック」をご覧ください。 また、データ操作のクライアント側のトレースについてはこちらを、管理操作の操作/診断ログについてはこちらをご覧ください。

メトリック - New Relic

ActiveMQ のどのメトリックが Azure Service Bus のどのメトリックにマップされるかを関連付けることができます。 New Relic の Web サイトで以下をご覧ください。

Note

現在、New Relic では ActiveMQ との直接的でシームレスな統合は実現されていませんが、Amazon MQ に使用できるメトリックが用意されています。 Amazon MQ は ActiveMQ から派生しているため、次の表では、AmazonMQ の New Relic メトリックを Azure Service Bus にマップしています。

メトリックのグループ化 Amazon MQ/ActiveMQ のメトリック Azure Service Bus のメトリック
ブローカー CpuUtilization CPUXNS
ブローカー MemoryUsage WSXNS
ブローカー CurrentConnectionsCount activeConnections
ブローカー EstablishedConnectionsCount activeConnections + connectionsClosed
ブローカー InactiveDurableTopicSubscribersCount サブスクリプションのメトリックを使用する
ブローカー TotalMessageCount キュー/トピック/サブスクリプション レベルの activeMessages を使用する
キュー/トピック EnqueueCount incomingMessages
キュー/トピック DequeueCount outgoingMessages
キュー QueueSize sizeBytes

移行

Service Bus を操作するために既存の JMS 2.0 アプリケーションを移行するには、以降のセクションの手順に従ってください。

ActiveMQ からトポロジをエクスポートして Service Bus でエンティティを作成する (省略可能)

クライアント アプリケーションが Service Bus にシームレスに接続できるようにするには、トポロジ (キュー、トピック、サブスクリプションを含む) を Apache ActiveMQ から Service Bus に移行します。

注意

JMS アプリケーションの場合は、ランタイム操作としてキュー、トピック、およびサブスクリプションを作成します。 ほとんどの JMS プロバイダー (メッセージ ブローカー) には、これらを実行時に作成する機能が用意されています。 そのため、このエクスポート手順は省略可能としています。 アプリケーションが実行時にトポロジを作成する権限を持っていることを確認するには、SAS の Manage 権限を含む接続文字列を使用してください。

これを行うには、次の手順を実行します。

  1. ActiveMQ コマンド ライン ツール を使用してトポロジをエクスポートします。
  2. Azure Resource Manager テンプレートを使用して同じトポロジを再作成します。
  3. Azure Resource Manager のテンプレートを実行します。

Service Bus JMS 実装の Maven の依存関係をインポートする

Service Bus とシームレスに接続できるようにするには、次のように、Maven pom.xml ファイルへの依存関係として azure-servicebus-jms パッケージを追加します。

<dependencies>
...
    <dependency>
        <groupId>com.microsoft.azure</groupId>
        <artifactId>azure-servicebus-jms</artifactId>
    </dependency>
...
</dependencies>

アプリケーション サーバー構成の変更

この部分は、ActiveMQ に接続するクライアント アプリケーションをホストしているアプリケーション サーバーに合わせてカスタマイズされています。

Spring アプリケーション

application.properties ファイルを更新する

Spring Boot アプリケーションを使用して ActiveMQ に接続している場合は、application.properties ファイルから ActiveMQ 固有のプロパティを削除する必要があります。

spring.activemq.broker-url=<ACTIVEMQ BROKER URL>
spring.activemq.user=<ACTIVEMQ USERNAME>
spring.activemq.password=<ACTIVEMQ PASSWORD>

次に、Service Bus 固有のプロパティを application.properties ファイルに追加します。

azure.servicebus.connection-string=Endpoint=myEndpoint;SharedAccessKeyName=mySharedAccessKeyName;SharedAccessKey=mySharedAccessKey
ActiveMQConnectionFactoryServiceBusJmsConnectionFactory に置き換えます。

次の手順では、ActiveMQConnectionFactory のインスタンスを ServiceBusJmsConnectionFactory に置き換えます。

Note

実際にコードをどのように変更するかは、アプリケーションと、依存関係の管理方法によって異なります。次のサンプルでは、変更する必要がある内容についてのガイダンスを示します。

以前は、次のように、ActiveMQConnectionFactory のオブジェクトをインスタンス化していた可能性があります。


String BROKER_URL = "<URL of the hosted ActiveMQ broker>";
ConnectionFactory factory = new ActiveMQConnectionFactory(BROKER_URL);

Connection connection = factory.createConnection();
connection.start();

これを、次のように、ServiceBusJmsConnectionFactory のオブジェクトをインスタンス化するように変更します。


ServiceBusJmsConnectionFactorySettings settings = new ServiceBusJmsConnectionFactorySettings();
String SERVICE_BUS_CONNECTION_STRING = "<Service Bus Connection string>";

ConnectionFactory factory = new ServiceBusJmsConnectionFactory(SERVICE_BUS_CONNECTION_STRING, settings);

Connection connection = factory.createConnection();
connection.start();

移行後

Service Bus でメッセージの送受信を開始するようにアプリケーションを変更したので、それが想定どおりに動作することを確認する必要があります。 完了したら、アプリケーション スタックをさらに調整し、最新化できます。

次のステップ

Azure Service Bus JMS 用の Spring Boot スターターを使用して、Service Bus とのシームレスな統合を実現します。

Service Bus メッセージングと JMS の詳細については、次をご覧ください。