將現有的 Java 訊息服務 (JMS) 2.0 應用程式從 Apache ActiveMQ 移轉至 Azure 服務匯流排

本文討論如何修改與 JMS 訊息代理程式互動的現有 Java 訊息服務 (JMS) 2.0 應用程式,使其改與 Azure 服務匯流排進行互動。 特別是,本文將說明如何從 Apache ActiveMQ 或 Amazon MQ 移轉。

Azure 服務匯流排支援透過進階訊息佇列通訊協定 (AMQP) 使用 JMS 2.0 API 的 Java 2 Platform Enterprise Edition 和 Spring 工作負載。

在您開始使用 Intune 之前

Azure 服務匯流排與 Apache ActiveMQ 之間的差異

Azure 服務匯流排和 Apache ActiveMQ 都是訊息代理程式,可作為 JMS 提供者,讓用戶端應用程式傳送訊息和接收訊息。 兩者都透過佇列啟用點對點語意,並且透過主題和訂用帳戶啟用發佈-訂閱語意。

即使如此,兩者仍有一些差異,如下表所示:

類別 ActiveMQ Azure 服務匯流排
應用程式階層處理 叢集整合型 雙層式
(閘道 + 後端)
通訊協定支援
  • AMQP
  • STOMP
  • OpenWire
AMQP
佈建模式
  • 基礎結構即服務 (IaaS),內部部署
  • Amazon MQ (受控平台即服務)
受控平台即服務 (PaaS)
訊息大小 可由客戶設定 100 MB (進階層)
高可用性 客戶管理的 由平台管理
災害復原 客戶管理的 由平台管理

目前支援和不支援的功能

下表列出 Azure 服務匯流排目前支援的 Java 訊息服務 (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
支援
訊息選取器 取決於建立的取用者 支援
傳遞延遲 (排定的訊息)
  • 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 服務匯流排的雙層特性可支援各種商務持續性功能 (高可用性和災害復原)。 不過,在使用 JMS 功能時需考量一些事項。

服務升級

如果服務匯流排升級和重新啟動,則會刪除暫時性佇列或主題。 如果您的應用程式容易因暫時性佇列或主題的資料遺失而受影響,請勿使用暫時性佇列或主題。 請改用永久性佇列、主題和訂用帳戶。

資料移轉

在移轉和修改用戶端應用程式以與 Azure 服務匯流排互動時,保存在 ActiveMQ 中的資料不會移轉至服務匯流排。 您可能需要以自訂應用程式來清空 ActiveMQ 佇列、主題和訂用帳戶,然後將訊息重新執行至服務匯流排的佇列、主題和訂用帳戶。

驗證和授權

Azure 角色型存取控制 (Azure RBAC) 由 Microsoft Entra ID 提供支援,是服務匯流排的常用驗證機制。 若要啟用角色型存取控制,請遵循 Azure 服務匯流排 JMS 2.0 開發人員指南中的步驟。

移轉前

版本檢查

撰寫 JMS 應用程式時,您會使用下列元件和版本:

元件 版本
Java 訊息服務 (JMS) API 1.1 或更新版本
AMQP 通訊協定 1.0

確定 AMQP 連接埠已開啟

服務匯流排支援透過 AMQP 通訊協定進行通訊。 為此,請啟用透過連接埠 5671 (AMQP) 和 443 (TCP) 的通訊。 根據用戶端應用程式的裝載位置,可能需要有支援票證,才能允許透過這些連接埠進行通訊。

重要

服務匯流排僅支援 AMQP 1.0 通訊協定。

設定企業設定

服務匯流排可啟用多種企業安全性和高可用性功能。 如需詳細資訊,請參閱

監視、警示和追蹤

對於每個服務匯流排命名空間,請將計量發佈至 Azure 監視器。 您可以使用這些計量來警示和動態調整配置給命名空間的資源。

如需不同計量及如何設定其警示的詳細資訊,請參閱 Azure 監視器中的服務匯流排計量。 您也可以進一步了解資料作業的用戶端追蹤管理作業的操作/診斷記錄

計量 - New Relic

您可以將 ActiveMQ 中的計量與 Azure 服務匯流排中的計量建立相互對應的關聯。 請參閱 New Relic 網站中的下列內容:

注意

目前,New Relic 並未與 ActiveMQ 直接而緊密地整合,但有適用於 Amazon MQ 的計量。 由於 Amazon MQ 衍生自 ActiveMQ,因此下表將 New Relic 計量從 Amazon MQ 對應至 Azure 服務匯流排。

計量分組 Amazon MQ/ActiveMQ 計量 Azure 服務匯流排計量
Broker CpuUtilization CPUXNS
Broker MemoryUsage WSXNS
Broker CurrentConnectionsCount activeConnections
Broker EstablishedConnectionsCount activeConnections + connectionsClosed
Broker InactiveDurableTopicSubscribersCount 使用訂用帳戶計量
Broker TotalMessageCount 使用佇列/主題/訂用帳戶層級 activeMessages
佇列/主題 EnqueueCount incomingMessages
佇列/主題 DequeueCount outgoingMessages
Queue QueueSize sizeBytes

遷移

若要移轉現有的 JMS 2.0 應用程式以與服務匯流排互動,請遵循後續幾節中的步驟。

從 ActiveMQ 匯出拓撲,並在服務匯流排中建立實體 (選擇性)

若要確保用戶端應用程式可順暢地與服務匯流排連線,請將拓撲 (包括佇列、主題和訂用帳戶) 從 Apache ActiveMQ 移轉至服務匯流排。

注意

對於 JMS 應用程式,您可以建立佇列、主題和訂用帳戶作為執行階段作業。 大部分的 JMS 提供者 (訊息代理程式) 都可讓您在執行階段建立這些項目。 這就是此匯出步驟被視為選擇性步驟的原因。 若要確保您的應用程式具有在執行階段建立拓撲的權限,請使用具有 SAS Manage 權限的連接字串。

若要這樣做:

  1. 使用 ActiveMQ 命令列工具來匯出拓撲。
  2. 使用 Azure Resource Manager 範本重新建立相同的拓撲。
  3. 執行 Azure Resource Manager 範本。

匯入服務匯流排 JMS 實作的 maven 相依性

若要確保能夠與服務匯流排順暢連線,請將 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 Boot 應用程式連線至 ActiveMQ,您可以從 application.properties 檔案中移除 ActiveMQ 特定屬性。

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

然後,將服務匯流排特定屬性新增至 application.properties 檔案。

azure.servicebus.connection-string=Endpoint=myEndpoint;SharedAccessKeyName=mySharedAccessKeyName;SharedAccessKey=mySharedAccessKey
ActiveMQConnectionFactory 取代為 ServiceBusJmsConnectionFactory

下一個步驟是將 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();

移轉後

現在,您已修改應用程式以開始從服務匯流排傳送和接收訊息,您應確認功能是否正常運作。 完成該作業後,您可以進一步將應用程式堆疊精簡化和現代化。

下一步

使用適用於 Azure 服務匯流排 JMS 的 Spring Boot Starter,與服務匯流排緊密整合。

若要深入了解服務匯流排傳訊和 JMS,請參閱: