如何编写 JMS Broker?

How to write a JMS Broker?

关于经纪人的Java消息服务是如何工作的?我看到了创建生产者和消费者客户端的教程和示例,但我不明白如何让代理使用 JMS。我看到有例如ActiveMQ,其中可以轻松地使用 class 来实现代理,但看起来我还必须在我的客户端中使用 ActiveMQ 方法来建立与代理的连接,而不是使用 pure JMS 方法?

JMS API 本质上是一个 客户端 API。它定义了客户端用来与代理交互的 API。 代理的实现方式完全是任意的,只要实现的行为符合 JMS 规范即可。这为实施 JMS 代理的人员提供了足够的自由,使其能够以适合他们自己的要求和约束的方式实施。这也意味着创建和配置代理实例(无论可能是什么代理)是 不是 由 JMS API.

定义的

此外,JMS 规范建立了 约定 客户端能够在 JNDI 中找到它们的 "admin objects"(即连接工厂和目的地)。 JMS 2 规范的第 5.1 节指出:

Although the interfaces for administered objects do not explicitly depend on JNDI, JMS establishes the convention that JMS clients find them by looking them up in a namespace using JNDI.

由于此约定,大多数 JMS 提供程序还提供 JNDI 实现以与 JMS 实现一起使用。 ActiveMQ 通过 org.apache.activemq.jndi.ActiveMQInitialContextFactory class 提供此功能。此 JNDI 实现的使用和配置在 ActiveMQ documentation.

中进一步讨论

由于使用 JNDI 只是一个 约定 大多数 JMS 提供程序都有访问管理对象的替代方法。例如,ActiveMQ 允许您使用特定于 ActiveMQ 的 classes.

以编程方式实例化连接工厂或目标

要将 JMS 客户端连接到其相应的代理,您首先需要决定是要使用 JNDI 还是特定于提供程序的机制。一般来说,JNDI 是首选方法,因为它是可插入的(使用应用程序 class 路径上的 jndi.properties 文件中定义的属性),这使得在需要时更容易在 JMS 代理之间切换。做出该决定后,您将获取 javax.jms.ConnectionFactory 的一个实例并使用它来创建您的 javax.jms.Connection,等等。在这一点之后有很多关于如何编写 JMS 客户端的教程和文档。

最终,在连接到 ActiveMQ 时,除了客户端应用程序中的 JMS 和 JNDI API,没有严格的需要使用任何东西。