你当前正在访问 Microsoft Azure Global Edition 技术文档网站。 如果需要访问由世纪互联运营的 Microsoft Azure 中国技术文档网站,请访问 https://docs.azure.cn。
本文讨论如何修改与 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(高级消息队列协议) |
预配模式 |
|
托管平台即服务 (PaaS) |
消息大小 | 可由客户配置 | 100 MB (高级层) |
高可用性 | 由客户管理 | 由平台管理 |
灾难恢复 | 由客户管理 | 由平台管理 |
当前支持和不支持的功能
下表列出了 Azure 服务总线当前支持的 Java 消息服务 (JMS) 功能。 它还展示了不支持的功能。
功能 / 特点 | API(应用程序编程接口) | 状态 |
---|---|---|
队列 |
|
支持 |
主题 |
|
支持 |
临时队列 |
|
支持 |
临时主题 |
|
支持 |
消息生成者/ JMSProducer |
|
支持 |
队列浏览器 |
|
支持 |
消息使用者/ JMSConsumer |
目前不支持 noLocal |
支持 |
共享持久订阅 |
|
支持 |
非共享持久订阅 |
目前不支持 noLocal,应将其设置为 false |
支持 |
共享非持久订阅 |
|
支持 |
非共享、非持久的订阅 |
目前不支持 noLocal,应将其设置为 false |
支持 |
消息选择器 | 取决于创建的使用者。 服务总线选择器不支持“LIKE”和“BETWEEN”SQL 关键字。 | 支持 |
交付延迟(计划的消息) |
|
支持 |
创建的消息 |
|
支持 |
跨实体事务 |
|
支持 |
分布式事务 | 不支持 |
注意事项
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
权限的连接字符串。
为此,请按以下步骤操作:
- 使用 ActiveMQ 命令行工具 导出拓扑。
- 使用 Azure 资源管理器模板重新创建相同的拓扑。
- 运行 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,请参阅: