次の方法で共有


既存の 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 では、JMS 2.0 API over Advanced Message Queueing Protocol (AMQP) を使用する Java 2 Platform、Enterprise Edition、Spring ワークロードがサポートされています。

開始する前に

Azure Service Bus と Apache ActiveMQ の違い

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

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

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

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

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

特徴 API(アプリケーション・プログラミング・インターフェース) ステータス
待ち行列
  • 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 に設定する必要があります
サポートされています
メッセージ セレクター 作成されたコンシューマーによって異なります。 Service Bus セレクターでは、"LIKE" と "BETWEEN" の SQL キーワードはサポートされていません。 サポートされています
配信の遅延 (スケジュール済みメッセージ)
  • 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)
サポートされています
分散トランザクション サポートされていません

考慮事項

Azure Service Bus の 2 層の性質により、さまざまなビジネス継続性機能 (高可用性とディザスター リカバリー) が提供されます。 ただし、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 アプリケーションの作成中は、次のコンポーネントとバージョンを使用します。

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

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

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

Von Bedeutung

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

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

Service Bus を使用すると、さまざまなエンタープライズ セキュリティと高可用性機能が可能になります。 詳細については、以下を参照してください。

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

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

さまざまなメトリックとそのアラートを設定する方法の詳細については、 Azure Monitor の Service Bus メトリックを参照してください。 また、データ操作のクライアント側トレース、管理操作の操作/診断ログの詳細を確認することもできます。

メトリック - New Relic

ActiveMQ のどのメトリックを Azure Service Bus のどのメトリックにマップするかを関連付けることができます。 New Relic の Web サイトから次を参照してください。

現在、New Relic には ActiveMQ との直接的でシームレスな統合はありませんが、Amazon MQ で使用できるメトリックがあります。 Amazon MQ は ActiveMQ から派生しているため、次の表は、Amazon MQ の 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

移動

既存の JMS 2.0 アプリケーションを移行して Service Bus と対話するには、次のいくつかのセクションの手順に従います。

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 とのシームレスな接続を確保するには、次のように、 azure-servicebus-jms パッケージを依存関係として Maven pom.xml ファイルに追加します。

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

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

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

Spring アプリケーション

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

Spring ブート アプリケーションを使用して 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に置き換えます。

実際のコードの変更は、アプリケーションと依存関係の管理方法に固有のものですが、次のサンプルでは、何を変更する必要があるかについてのガイダンスを提供します。

以前は、次のように、 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 からのメッセージの送受信を開始するようにアプリケーションを変更したら、期待どおりに動作することを確認する必要があります。 完了したら、アプリケーション スタックをさらに絞り込んで最新化することができます。

次のステップ

Service Bus とのシームレスな統合 には、Azure Service Bus JMS 用の Spring Boot Starter を使用します。

Service Bus メッセージングと JMS の詳細については、以下を参照してください。