將現有的 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 |
佈建模式 |
|
受控平台即服務 (PaaS) |
訊息大小 | 可由客戶設定 | 100 MB (進階層) |
高可用性 | 客戶管理的 | 由平台管理 |
災害復原 | 客戶管理的 | 由平台管理 |
目前支援和不支援的功能
下表列出 Azure 服務匯流排目前支援的 Java 訊息服務 (JMS) 功能。 此外也會顯示不支援的功能。
功能 | API | 狀態 |
---|---|---|
佇列 |
|
支援 |
主題 |
|
支援 |
暫時性佇列 |
|
支援 |
暫時性主題 |
|
支援 |
訊息生產者 / JMSProducer |
|
支援 |
佇列瀏覽器 |
|
支援 |
訊息取用者/ JMSConsumer |
目前不支援 noLocal |
支援 |
共用永久性訂閱 |
|
支援 |
非共用永久性訂閱 |
noLocal 目前不受支援,應設定為 false |
支援 |
共用非永久性訂閱 |
|
支援 |
非共用非永久性訂閱 |
noLocal 目前不受支援,應設定為 false |
支援 |
訊息選取器 | 取決於建立的取用者 | 支援 |
傳遞延遲 (排定的訊息) |
|
支援 |
已建立訊息 |
|
支援 |
跨實體交易 |
|
支援 |
分散式交易 | 不支援 |
考量
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
權限的連接字串。
若要這樣做:
- 使用 ActiveMQ 命令列工具來匯出拓撲。
- 使用 Azure Resource Manager 範本重新建立相同的拓撲。
- 執行 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,請參閱: