java中的JNDI详解

来源:互联网 发布:随你淘宝皇家小地主txt 编辑:程序博客网 时间:2024/05/22 07:07

java中实现JNDI的接口:

javax.naming.Context和它的实现类javax.naming.InitialContext


开始的版本:

@since JNDI 1.1 / Java 2 Platform, Standard Edition, v 1.3


什么是JNDI?

JNDI是一个标准的Java扩展,它提供了一个统一的API,用于访问多种目录和明明服务。在这方面、它和JDBC有点类似,使用JDBC编写的代码能够访问不同的关系数据库、比如说Oracle、SQLSERVER或Sybase等;而使用JNDI编写的代码、则能访问不同的目录和明明服务,比如LDAP、NDS,CORBA命名服务,以及JMS服务器提供的私有命名服务。

在JMS中,JNDI主要用于命名服务来定位受管对象。受管对象就是由系统管理员创建和配置的JMS对象。受管对象包括JMS connectionFactory和Destination对象、比如说主题和队列。受管对象和命名服务中的一个名称互相绑定在一起。一个命名服务将名称和分布式对象、文件和设施管理起来,以便它们可以使用简单的名称而不是密码似的网络地址实现在网络上定位。DNS就是命名服务的一个例子,它将像www.oreilly.com这样的因特网主机名转换为一个网络地址,浏览器则会使用该地址连接到Web服务器。还有许多
其他的命名服务,比如CORBA中的CosNaming和Java RMI注册(rigistry)等。命名服务允许打印机、分布式对象、JMS受管对象和名称相互绑定,并按照和文件系统相似的层次进行组织。目录是一种更为复杂的命名服务类型。

JNDI提供一个隐藏了命名服务细节的抽象,使得客户端应用抽象的可移植性更高。使用JNDI,JMS客户端能够浏览一个命名服务,并在不知道服务细节或者它如何实现的情况下,引用受管对象。通常,JMS服务器会和一个标准JNDI驱动器(也称为服务提供者),以及类似于轻量级目录访问协议这样的目录服务结合使用,或者提供一个私有的JNDI服务提供者和目录服务。

JNDI特定(JNDI既是虚拟的也可以说是动态的):

说它是虚拟的,是因为它允许一个命名服务和另一个命名服务互相连接。你可以使用JNDI,通过问卷、打印机,JMS受管对象的目录,以及命名服务虚拟连接之后的其他自然目录,实现向下钻取(drill down)用户并不知道或并不关心该目录的实际位置。作为一名管理员,你可以创建跨多个物理位置的多种不同服务的虚拟目录。

说JNDI是动态的,是因为它允许特定类型的命名和目录服务所使用的JNDI驱动器在运行时动态加载。驱动器将一个特定类型的命名服务或目录服务映射成标准的JNDI类接口。用于LDAP\Novell NetWare NDS,Sun Solaris NID+,CORBA CosNamming,以及许多其他类型的命名和目录服务(包括私有服务)的各个驱动器都已经创建完毕。动态地加载JNDI驱动器(服务提供者),使得一个客户端在预先不知道可能会发生哪种服务的情况下,实现跨任意目录服务导航。


常见的技术哪些支持JNDI呢?

有JDBC数据库,JMS连接工厂,JavaMail连接工厂,URL连接工厂等。


在ActiveMQ中对JNDI的支持使用:

需要配置jndi.properties属性文件内容如下:

java.naming.factory.initial=org.apache.activemq.jndi.ActiveMQInitialContextFactoryjava.naming.provider.url=tcp://192.168.204.153:61616java.naming.security.principal=nulljava.naming.security.credentials=nullconnectionFactoryNames=queueCFqueue.applyQueue=example.applyQueuequeue.responseQueue=example.responseQueue

使用JNDI从上下文中找工厂和对应的主题如下:

Context context = new InitialContext();ConnectionFactory factory = (ConnectionFactory) context.lookup("queueCF");Queue applyQueue = (Queue) context.lookup("applyQueue");

同时你也可以使用其他的方式来进行配置jndi:

Properties props = new Properties();props.setProperty(Context.INITIAL_CONTEXT_FACTORY,"org.apache.activemq.jndi.ActiveMQInitialContextFactory");props.setProperty(Context.PROVIDER_URL,"tcp://hostname:61616");javax.naming.Context ctx = new InitialContext(props);||




参考官网文章:

http://activemq.apache.org/jndi-support.html

http://activemq.apache.org/ajax.html

0 0