Nota:
El acceso a esta página requiere autorización. Puede intentar iniciar sesión o cambiar directorios.
El acceso a esta página requiere autorización. Puede intentar cambiar los directorios.
本文介绍如何使用热门的 Java 消息服务 (JMS) 2.0 API 通过高级消息队列协议 (AMQP) 1.0 协议与 Azure 服务总结交互。
重要说明
- JMS 2.0 API 支持需要 Azure 服务总线高级层 和 azure-servicebus-jms 库。 直接使用其他 JMS 库(例如 qpid-jms-client)对高级命名空间进行操作,会表现出 JMS 1.1 的行为,并且某些 JMS 2.0 功能可能无法如预期地正常运作。
- 该库是 开源 的,基于 qpid-jms-client 构建 — 所有 qpid-jms-client API 都使用它,因此没有供应商锁定。 它还为预提取策略、重新连接策略、Microsoft Entra ID、托管标识支持和空闲时自动删除提供默认值。
- 该库在 雅加达 EE 和 Java EE 的两个变体中提供。 有关使用哪个工件的详细信息,请参阅 Jakarta EE 和 javax 支持。
Jakarta EE 和 javax 支持
该 azure-servicebus-jms 库有两个变体,支持旧版 Java EE (javax.jms) 和较新的 Jakarta EE (jakarta.jms) API 命名空间。
| API 命名空间 | Maven 工件 | 版本 | JMS 规范 |
|---|---|---|---|
jakarta.jms (雅加达 EE 9+) |
com.azure:azure-servicebus-jms | 2.0.0+ | 雅加达消息传送 (JMS 2.0) |
javax.jms (Java EE) |
com.microsoft.azure:azure-servicebus-jms | 1.0.x | JMS 2.0 |
我应该使用哪个工件?
如果你的项目使用 Jakarta EE 9 或更高版本 (例如 Spring Boot 3.x、Quarkus 3.x 或任何导入
jakarta.jms.*的框架),请使用com.azure项目:<dependency> <groupId>com.azure</groupId> <artifactId>azure-servicebus-jms</artifactId> <version>2.0.0</version> </dependency>如果项目仍在使用 Java EE(导入
javax.jms.*),请继续使用com.microsoft.azure构件:<dependency> <groupId>com.microsoft.azure</groupId> <artifactId>azure-servicebus-jms</artifactId> <version>1.0.2</version> </dependency>
重要
不要混合这两个工件。 使用 `com.azure:azure-servicebus-jms` 的项目中导入 `javax.jms.*` 会导致编译错误,反之亦然。
从 javax 迁移到 Jakarta
如果要将应用程序从 Java EE 升级到 Jakarta EE:
- 将 Maven 依赖项组 ID 从
com.microsoft.azure替换为com.azure,并将版本更新到2.0.0或更高版本。 - 将代码中的所有
javax.jms.*导入更新为jakarta.jms.*。 -
ServiceBusJmsConnectionFactoryAPI 和配置在两个变体中保持不变,因此无需在导入和依赖项更新之外进行代码更改。
先决条件
开始使用服务总线
此指南假定已有服务总线命名空间。 如果没有,则请使用 Azure 门户创建命名空间和队列。 若要详细了解如何创建服务总线命名空间和队列,请参阅通过 Azure 门户开始使用服务总线队列。
设置 Java 开发环境
若要开发 Java 应用程序,需要设置适当的开发环境 -
- 安装 JDK(Java 开发工具包)或 JRE (Java Runtime Environment)。
- 在生成路径和适当的系统变量中添加 JDK 或 JRE。
- 安装 Java IDE 以利用 JDK 或 JRE。 例如 Eclipse 或 IntelliJ。
若要详细了解如何在 Azure 上准备适用于 Java 的开发人员环境,请使用本指南。
支持哪些 JMS 功能?
下表列出了 Azure 服务总线当前支持的 Java 消息服务 (JMS) 功能。 它还展示了不被支持的功能。
| 功能 | API | 状态 |
|---|---|---|
| 队列 |
|
支持 |
| 主题 |
|
支持 |
| 临时队列 |
|
支持 |
| 临时主题 |
|
支持 |
| 消息生成者/ JMSProducer |
|
支持 |
| 队列浏览器 |
|
支持 |
| 消息使用者/ JMSConsumer |
目前不支持 noLocal |
支持 |
| 共享持久订阅 |
|
支持 |
| 非共享持久订阅 |
目前不支持 noLocal,应将其设置为 false |
支持 |
| 共享非持久订阅 |
|
支持 |
| 非共享非持久订阅 |
目前不支持 noLocal,应将其设置为 false |
支持 |
| 消息选择器 | 取决于创建的使用者。 服务总线选择器不支持“LIKE”和“BETWEEN”SQL 关键字。 | 支持 |
| 交付延迟(定时消息) |
|
支持 |
| 消息已创建 |
|
支持 |
| 跨实体事务 |
|
支持 |
| 分布式事务 | 不支持 |
下载 Java 消息服务 (JMS) 客户端库
若要利用高级层中提供的所有功能,请将 azure-servicebus-jms 库添加到项目的生成路径。 此包提供必要的默认值,例如预提取策略值、重新连接策略、Microsoft Entra ID 和托管标识支持。 选择与项目的 API 命名空间匹配的项目(有关详细信息,请参阅 Jakarta EE 和 javax 支持 ):
雅加达 EE (jakarta.jms):
<dependency>
<groupId>com.azure</groupId>
<artifactId>azure-servicebus-jms</artifactId>
<version>2.0.0</version>
</dependency>
Java EE (javax.jms):
<dependency>
<groupId>com.microsoft.azure</groupId>
<artifactId>azure-servicebus-jms</artifactId>
<version>1.0.2</version>
</dependency>
编写 Java 应用程序代码
导入依赖项后,可以采用独立于 JMS 提供程序的方式编写 Java 应用程序。
使用 JMS 连接到 Azure 服务总线
若要使用 JMS 客户端与 Azure 服务总线连接,需要连接字符串,该字符串在 Azure 门户中“共享访问策略”中的“主连接字符串”下提供 。
实例化
ServiceBusJmsConnectionFactorySettingsServiceBusJmsConnectionFactorySettings connFactorySettings = new ServiceBusJmsConnectionFactorySettings(); connFactorySettings.setConnectionIdleTimeoutMS(20000);使用相应的
ServiceBusConnectionString实例化ServiceBusJmsConnectionFactory。String ServiceBusConnectionString = "<SERVICE_BUS_CONNECTION_STRING_WITH_MANAGE_PERMISSIONS>"; ConnectionFactory factory = new ServiceBusJmsConnectionFactory(ServiceBusConnectionString, connFactorySettings);使用
ConnectionFactory创建Connection,然后创建SessionConnection connection = factory.createConnection(); Session session = connection.createSession();或者 "a
JMSContext"(用于 JMS 2.0 客户端)JMSContext jmsContext = factory.createContext();重要
虽然 JMS“会话”和服务总线“会话”的名称相似,但它们完全不相关。
在 JMS 1.1 中,会话是允许创建
MessageProducer、MessageConsumer和Message本身的 API 的基本构建基块。 有关详细信息,请参阅 JMS API 编程模型在服务总线中,会话是用于在队列和订阅上实现 FIFO 处理的服务端和客户端构造。
编写 JMS 应用程序
Session 或 JMSContext 经过实例化后,对于管理和数据这两方面的操作,应用程序都可以使用熟悉的 JMS API 来执行。 请参阅支持的 JMS 功能的列表,以了解哪些 API 受支持。 下面是一些用于开始使用 JMS 的示例代码片段 -
将消息发送到队列和主题中
// Create the queue and topic
Queue queue = jmsContext.createQueue("basicQueue");
Topic topic = jmsContext.createTopic("basicTopic");
// Create the message
Message msg = jmsContext.createMessage();
// Create the JMS message producer
JMSProducer producer = jmsContext.createProducer();
// send the message to the queue
producer.send(queue, msg);
// send the message to the topic
producer.send(topic, msg);
从队列接收消息
// Create the queue
Queue queue = jmsContext.createQueue("basicQueue");
// Create the message consumer
JMSConsumer consumer = jmsContext.createConsumer(queue);
// Receive the message
Message msg = (Message) consumer.receive();
从针对某主题的共享持久订阅接收消息
// Create the topic
Topic topic = jmsContext.createTopic("basicTopic");
// Create a shared durable subscriber on the topic
JMSConsumer sharedDurableConsumer = jmsContext.createSharedDurableConsumer(topic, "sharedDurableConsumer");
// Receive the message
Message msg = (Message) sharedDurableConsumer.receive();
“摘要”
本指南展示了 Java 客户端应用程序如何使用 Java 消息服务 (JMS) 通过 AMQP 1.0 实现与 Azure 服务总线交互。
也可以通过其他语言(包括 .NET、C、Python 和 PHP)使用 Service Bus AMQP 1.0。 使用这些不同语言构建的组件可以通过服务总线中的 AMQP 1.0 支持可靠且完整保真地交换消息。