你当前正在访问 Microsoft Azure Global Edition 技术文档网站。 如果需要访问由世纪互联运营的 Microsoft Azure 中国技术文档网站,请访问 https://docs.azure.cn

将现有的 Java 消息服务 (JMS) 2.0 应用程序从 Apache ActiveMQ 迁移到 Azure 服务总线

本文讨论如何修改与 JMS Broker 交互的现有 Java 消息服务 2.0 应用程序,以改为与 Azure 服务总线交互。 具体而言,本文介绍如何从 Apache ActiveMQ 或 Amazon MQ 迁移。

Azure 服务总线支持通过高级消息队列协议(AMQP)使用 JMS 2.0 API 的 Java 2 平台、企业版和 Spring 工作负载。

在您开始之前

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(队列队列)
  • JMSContext.createBrowser(队列队列、字符串 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(主题、字符串名称、字符串 messageSelector)
支持
非共享持久订阅
  • JMSContext.createDurableConsumer(主题,字符串名称)
  • createDurableConsumer(主题、字符串名称、String messageSelector、boolean noLocal)

目前不支持 noLocal,应将其设置为 false
支持
共享非持久订阅
  • JMSContext.createSharedConsumer(主题 topic,字符串 sharedSubscriptionName)
  • JMSContext.createSharedConsumer(Topic 主题, String 共享订阅名, String 消息选择器)
支持
非共享、非持久的订阅
  • JMSContext.createConsumer(目的地)
  • JMSContext.createConsumer(Destination destination, String messageSelector)
  • JMSContext.createConsumer(Destination destination, String messageSelector, boolean noLocal)

目前不支持 noLocal,应将其设置为 false
支持
消息选择器 取决于创建的使用者。 服务总线选择器不支持“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 服务总线的两层性质提供了各种业务连续性功能(高可用性和灾难恢复)。 但是,在使用 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 Monitor。 可以使用这些指标来警报和动态缩放分配给命名空间的资源。

有关不同指标以及如何设置警报的详细信息,请参阅 Azure Monitor 中的服务总线指标。 还可以了解有关 数据操作的客户端跟踪 以及 管理操作的操作/诊断日志记录的详细信息。

指标 - New Relic

可以将 ActiveMQ 中的哪些指标关联到 Azure 服务总线中的指标。 请参阅 New Relic 网站中的以下内容:

注释

目前,New Relic 没有与 ActiveMQ 的直接无缝集成,但它们确实具有适用于 Amazon MQ 的指标。 由于 Amazon MQ 派生自 ActiveMQ,下表将 New Relic 指标从 Amazon MQ 映射到 Azure 服务总线。

指标分组 Amazon MQ/ActiveMQ 指标 Azure 服务总线指标
经纪人 CpuUtilization CPUXNS
经纪人 MemoryUsage WSXNS
经纪人 CurrentConnectionsCount activeConnections
经纪人 EstablishedConnectionsCount activeConnections + connectionsClosed
经纪人 InactiveDurableTopicSubscribersCount 使用订阅指标
经纪人 TotalMessageCount 使用队列/主题/订阅级别 activeMessages
队列/主题 EnqueueCount incomingMessages
队列/主题 DequeueCount outgoingMessages
队列 QueueSize sizeBytes

迁移

若要迁移现有 JMS 2.0 应用程序以与服务总线交互,请遵循后续几个部分中的步骤。

从 ActiveMQ 导出拓扑并在服务总线中创建实体(可选)

若要确保客户端应用程序可与服务总线无缝连接,请将拓扑(包括队列、主题和订阅)从 Apache ActiveMQ 迁移到服务总线。

注释

对于 JMS 应用程序,可以创建队列、主题和订阅作为运行时作。 大多数 JMS 提供程序(消息代理)都能够在运行时创建这些对象。 这就是此导出步骤被视为可选的原因。 若要确保应用程序有权在运行时创建拓扑,请使用具有 SAS Manage 权限的连接字符串。

为此,请按以下步骤操作:

  1. 使用 ActiveMQ 命令行工具 导出拓扑。
  2. 使用 Azure 资源管理器模板重新创建相同的拓扑。
  3. 运行 Azure 资源管理器模板。

导入用于服务总线 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 启动应用程序连接到 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();

迁移后

现在,你已将应用程序修改为开始从服务总线发送和接收消息,应该验证它是否按预期工作。 完成后,可以继续进一步优化和现代化应用程序堆栈。

后续步骤

使用 Spring Boot Starter for Azure Service Bus JMS 以实现与服务总线的无缝集成。

若要详细了解服务总线消息传送和 JMS,请参阅: