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

时间:2019-08-28 14:06:47

标签: wildfly jndi activemq-artemis

在Apache的ActiveMQ Artemis文档中,有一条声明:

  

Apache ActiveMQ Artemis没有JNDI服务器。相反,它使用依赖于环境中设置的特殊属性的客户端JNDI实现来构造适当的JMS对象。换句话说,没有对象存储在Apache ActiveMQ Artemis服务器上的JNDI中,而是仅根据提供的配置在客户端上实例化它们。

现在,我不了解客户的服务方式,例如Widlfly,连接到独立的Artemis经纪人。我知道有一个客户端库作为Wildfly的模块提供,并且我知道要在本地WF队列和远程WF队列之间配置JMS桥。但是它如何知道如何使用客户端的JNDI服务器进行连接?这是否意味着通过配置Wildfly的standalone.xml文件,您可以配置JNDI名称以在Wildfly上查找负责通信的资源,还是我错过了一些东西?那么,引用的句子在Artemis的文档中有什么作用?

1 个答案:

答案 0 :(得分:0)

JMS和JNDI之类的接口的目标之一是减轻客户端应用程序的负担,该负担必须“知道”有关底层实现的任何信息。因此,例如,使用JMS和JNDI编写的应用程序可以连接到提供JNDI实现的任何 JMS兼容代理。一天,一个独立的Java应用程序可以连接到ActiveMQ,第二天它可以连接到WebLogic,只需更改jndi.properties中的配置即可。

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

您从ActiveMQ Artemis文档中引用的部分只是向用户说明使用JNDI实现时没有网络客户端/服务器通信。例如,这与Wildfly不同,Wildfly确实实现了“真实的” JNDI服务器,并且其JNDI客户端确实通过网络进行通信以查找对象。

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

JNDI中存储的Java对象可以是任何类型的对象。 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客户端实现使用其自己的“核心”有线协议执行网络通信。
  • ActiveMQ Artemis是最常用的独立版本,因此它需要自己的JNDI实现以促进JMS遵从性。
  • documentation you cited previously中提供了有关如何使用ActiveMQ Artemis JNDI实现的说明。