在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的文档中有什么作用?
答案 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代理进行通信。
其他说明: