Observação
O acesso a essa página exige autorização. Você pode tentar entrar ou alterar diretórios.
O acesso a essa página exige autorização. Você pode tentar alterar os diretórios.
Warning
本文介绍了Azure 服务总线 Standard层中对Java消息服务(JMS) 1.1 API的有限支持。
想要完整的 JMS 2.0 支持,可以使用 Azure 服务总线 Premium tier。
使用 Apache Qpid JMS 通过 AMQP 1.0 发送和接收消息。 这些示例直接使用 Qpid;它们不依赖于旧com.microsoft.azure:azure-servicebus库或内部Azure客户端库类。
服务总线入门
创建一个 服务总线 命名空间和队列。 队列样本使用名为 BasicQueue的队列。
创建一个带有发送和侦听权限的共享访问策略。 配置以下环境变量:
| Variable | Value |
|---|---|
SB_SAMPLES_NAMESPACE |
命名空间主机,例如 example.servicebus.chinacloudapi.cn。 |
SB_SAMPLES_SAS_KEY_NAME |
共享访问策略名称。 |
SB_SAMPLES_SAS_KEY |
共享访问策略密钥。 |
不要将访问密钥提交到版本控制中。 这些是不同的值,不是 服务总线 连接字符串。
下载AMQP 1.0 JMS客户端库
安装 JDK 11 或更高版本和 Maven,然后克隆 服务总线 样本库。
JMS 队列样本其依赖项包含在 pom.xml 中。
示例使用了 Qpid JMS 1.x 客户端的 javax.jms API。 有关Qpid版本和API信息,请参见 Apache Qpid JMS文档。
编写 Java 应用程序
Java命名与目录接口
Java命名与目录接口(JNDI)将逻辑名称与物理地址分离。 Qpid JNDI 提供者通过配置属性解析连接工厂和队列。
设置JNDI上下文并配置ConnectionFactory对象
以下代码使用了之前配置的命名空间、主机和策略凭证:
import javax.jms.ConnectionFactory;
import javax.jms.Connection;
import javax.jms.Destination;
import javax.jms.MessageProducer;
import javax.jms.Session;
import javax.naming.Context;
import javax.naming.InitialContext;
import java.util.Hashtable;
String namespaceHost = System.getenv("SB_SAMPLES_NAMESPACE");
String sasKeyName = System.getenv("SB_SAMPLES_SAS_KEY_NAME");
String sasKey = System.getenv("SB_SAMPLES_SAS_KEY");
if (namespaceHost == null || namespaceHost.isEmpty()
|| sasKeyName == null || sasKeyName.isEmpty()
|| sasKey == null || sasKey.isEmpty()) {
throw new IllegalArgumentException("Set the namespace host, policy name, and policy key.");
}
Hashtable<String, String> properties = new Hashtable<>();
properties.put(Context.INITIAL_CONTEXT_FACTORY,
"org.apache.qpid.jms.jndi.JmsInitialContextFactory");
properties.put("connectionfactory.SBCF",
"amqps://" + namespaceHost + "?amqp.idleTimeout=120000");
properties.put("queue.QUEUE", "BasicQueue");
Context context = new InitialContext(properties);
ConnectionFactory factory = (ConnectionFactory) context.lookup("SBCF");
Destination queue = (Destination) context.lookup("QUEUE");
配置生产者和消费者目标队列
创建一个带有策略名称和密钥的JMS连接。 使用通过 JNDI 解析的队列作为目的地,而不是将队列名称字符串强制转换为 Destination。
Connection connection = factory.createConnection(sasKeyName, sasKey);
Session session = connection.createSession(false, Session.CLIENT_ACKNOWLEDGE);
MessageProducer producer = session.createProducer(queue);
为消费者创建一个单独的会话。 在收到消息之前先启动其连接。
一个简单的JMS应用程序,使用服务总线队列
JMS 队列快速启动包含完整的应用程序,包括发送消息、接收和确认消息以及关闭 JMS 资源。
运行应用程序
从目录中 samples/Java/qpid-jms-client/JmsQueueQuickstart 构建示例。 集成测试还使用配置后的命名空间和队列。
mvn clean package
运行打包后的应用程序:
java -jar target/jmsqueuequickstart-1.0.0-jar-with-dependencies.jar
应用程序发送十条消息,接收并确认后退出。 要编译和打包而不运行集成测试,请使用 mvn -DskipTests package。
AMQP 处置和服务总线操作映射
以下是将 AMQP 处置转换为服务总线操作的方法:
ACCEPTED = 1; -> Complete()
REJECTED = 2; -> DeadLetter()
RELEASED = 3; (just unlock the message in service bus, will then get redelivered)
MODIFIED_FAILED = 4; -> Abandon() which increases delivery count
MODIFIED_FAILED_UNDELIVERABLE = 5; -> Defer()
JMS 主题与 服务总线 主题的区别
通过 JMS API 使用 服务总线 主题和订阅可实现基本的发送和接收功能。 当你从其他消息代理迁移带有JMS兼容API的应用时,这是一种方便的选择,尽管服务总线主题与JMS主题不同,需要一些调整。
服务总线 主题将消息路由到命名、共享和持久订阅中,这些订阅通过 Azure 资源管理界面、Azure 命令行工具或 Azure 门户进行管理。 每个订阅允许最多2000条选择规则,每个规则可能包含过滤条件,对于SQL过滤器,还包含元数据转换动作。 每个过滤条件匹配都会选择要复制到订阅的输入消息。
从订阅中接收消息与从队列接收消息是相同的。 每个订阅都配有一个死信队列,并能自动将消息转发到其他队列或主题。
JMS 主题允许客户端动态创建非持久订阅者和持久订阅者,这些订阅者可选择使用消息选择器来过滤消息。 这些非共享实体不被 服务总线 Standard 支持。 服务总线 的 SQL 过滤规则语法类似于 JMS 支持的消息选择器语法。
JMS 主题发布端与 服务总线 Standard 兼容,如 JMS 主题示例所示,但动态订阅者则不兼容。
不支持的功能与限制
以下限制适用于使用 服务总线 Standard 的 AMQP 1.0 上的 JMS:
- 每个会话只允许一个 MessageProducer 或 MessageConsumer 对象。 如果你需要多个生产者或消费者,可以为每个生产者或消费者创建一个专用会话。
- 不支持易失性主题订阅。
- 不支持 MessageSelector 对象。
- 不支持分布式事务,但支持事务性会话。
服务总线 Standard 将控制平面与数据平面分开,因此不支持 JMS 的多个动态拓扑功能。
| 不支持的方法 | 替换为 |
|---|---|
| createDurableSubscriber | 创建一个移植消息选择器的主题订阅。 |
| createDurableConsumer | 创建一个移植消息选择器的主题订阅。 |
| createSharedConsumer | 服务总线 主题始终可共享。 参见 JMS 主题与 服务总线 主题。 |
| createSharedDurableConsumer | 服务总线 主题始终可共享。 参见 JMS 主题与 服务总线 主题。 |
| createTemporaryTopic | 通过管理 API、工具或门户创建主题,并将 AutoDeleteOnIdle 设置为过期期。 |
| 创建主题 | 通过管理API、工具或门户创建主题。 |
| 取消订阅 | 通过管理API、工具或门户删除主题。 |
| createBrowser | 使用服务总线客户端库的窥视功能。 |
| 创建队列 | 通过管理API、工具或门户创建队列。 |
| createTemporaryQueue | 通过管理 API、工具或门户创建队列,并将 AutoDeleteOnIdle 设置为过期期限。 |
| 非阻塞接收 | 使用带有短超时的接收操作。 |