Artemis 客户端如何使用JNDI 来查找资源?

How does Artemis client use JNDI to lookup resources?

在Apache的ActiveMQ Artemis文档中,有这样一句话:

Apache ActiveMQ Artemis does not have a JNDI server. Rather, it uses a client-side JNDI implementation that relies on special properties set in the environment to construct the appropriate JMS objects. In other words, no objects are stored in JNDI on the Apache ActiveMQ Artemis server, instead, they are simply instantiated on the client based on the provided configuration.

现在,我不明白客户,例如Widlfly,连接到独立的 Artemis 代理。我知道有一个作为 Wildfly 模块提供的客户端库,我知道在本地 WF 队列和远程队列之间配置 JMS 桥。但是它怎么知道如何使用客户端的 JNDI 服务器进行连接呢?这是否意味着通过配置 Wildfly 的 standalone.xml 文件,您可以配置 JNDI 名称以在 Wildfly 上查找负责通信的资源,或者我是否遗漏了什么?那么引用的句子在 Artemis 的文档中有什么作用?

JMS 和 JNDI 等接口的目标之一是减轻客户端应用程序必须 "know" 任何有关底层实现的负担。因此,例如,使用 JMS 和 JNDI 编写的应用程序可以连接到提供 JNDI 实现的 any JMS 兼容代理。有一天,一个独立的 Java 应用程序可以连接到 ActiveMQ,第二天它可以连接到 WebLogic,所有需要更改的只是 jndi.properties.

中的配置

任何使用 JMS 和 JNDI APIs 的 Java 应用程序,无论它是 运行 独立的还是在像 Wildfly 这样的应用程序服务器中,如果 JNDI 配置是正确的。只要您提供正确的 JNDI 配置,它就会 "know" 如何连接,因为所有这些知识都包含在 ActiveMQ Artemis JMS 和 JNDI 实现中,并且从接口后面的应用程序中抽象出来。

您引用ActiveMQ Artemis 文档的部分只是为了向用户解释在使用其JNDI 实现时没有网络client/server 通信。例如,这与 Wildfly 形成对比,Wildfly 实现了 "real" JNDI 服务器并且其 JNDI 客户端通过网络进行通信以查找对象。

对象的物理存储位置取决于您使用的 JNDI 实现。如果您使用的是 Wildfly JNDI 实现,则对象存储在服务器上,任何客户端都可以与服务器通信以查找这些对象。如果您使用的是 Artemis JNDI 实现,那么对象将存储在实际的客户端 JNDI 实现中。 类 是否模块化对 JNDI 查找没有影响。

Java JNDI 中存储的对象可以是任何类型的对象。 JNDI 实现不关心它是什么类型的对象。您可以在 Wildfly 的 JNDI 中存储指向远程 Artemis 代理的 Artemis JMS 连接工厂。如果您有这样的配置,并且 Wildfly 中的 JMS 应用程序从 Wildfly 的 JNDI 查找这个 Artemis JMS 连接工厂,那么 JMS 连接工厂实现本身将与远程 Artemis 代理通信。

补充说明:

  • JNDI 不是协议。这只是一个 API.
  • 如果您在 Wildfly 中使用 Artemis JMS 客户端,它肯定不会使用 JNDI 来调用远程 Artemis 代理上的对象。如前所述,Artemis JNDI 实现仅为客户端。它不执行任何网络通信。 Artemis JMS 客户端实现使用其自己的 "core" 有线协议执行网络通信。
  • ActiveMQ Artemis 最常独立使用,因此它需要自己的 JNDI 实现以促进 JMS 合规性。
  • 有关如何使用 ActiveMQ Artemis JNDI 实现的说明位于 documentation you cited previously