Java 消息服务如何与代理有关?我看到了创建生产者和消费者客户端的教程和示例,但我不明白如何使用JMS让经纪人参与进来。我看到例如 ActiveMQ 可以轻松拥有一个类来实现代理,但看起来我还必须在客户端中使用 ActiveMQ 方法来建立与代理的连接,而不是使用纯JMS 方法?
JMS API 本质上是一个客户端API。它定义了客户端用于与代理交互的 API。代理的实现方式是完全任意的,前提是实现的行为符合 JMS 规范。这为那些正在实现 JMS 代理的人提供了足够的自由,以适合他们自己的要求和约束的方式实现它。这也意味着创建和配置代理实例(无论代理是什么(不是由 JMS API 定义的。
此外,JMS 规范建立了客户端能够在 JNDI 中找到其"管理对象"(即连接工厂和目的地(的约定。JMS 2 规范的第 5.1 节指出:
尽管受管对象的接口不显式依赖 在 JNDI 上,JMS 建立了 JMS 客户端找到它们的约定 使用 JNDI 在命名空间中查找它们。
由于此约定,大多数 JMS 提供程序还提供了与 JMS 实现一起使用的 JNDI 实现。ActiveMQ通过org.apache.activemq.jndi.ActiveMQInitialContextFactory
类提供此功能。此 JNDI 实现的用法和配置将在 ActiveMQ 文档中进一步讨论。
由于使用 JNDI 只是一种约定,因此大多数 JMS 提供程序都有访问管理对象的替代方法。例如,ActiveMQ 允许您使用 ActiveMQ 特定的类以编程方式实例化连接工厂或目标。
要将 JMS 客户机连接到其相应的代理,首先需要确定是要使用 JNDI 还是特定于提供程序的机制。一般来说,JNDI 是首选方法,因为它是可插入的(使用应用程序类路径上的jndi.properties
文件中定义的属性(,这使得在需要时更容易在 JMS 代理之间切换。一旦做出决定,您就可以获得javax.jms.ConnectionFactory
的实例并使用它来创建您的javax.jms.Connection
,等等。在此之后,有很多关于如何编写 JMS 客户端的教程和文档。
最终,在连接到ActiveMQ时,除了客户端应用程序中的JMS和JNDI API之外,不需要使用任何其他内容。