Java 使用 JNDI 服务
JNDI 简述
JNDI 是一个标准的 java 扩展,它提供了一个统一的 API,用于访问多种目录和命名服务。在这方面,它和 JDBC 有点类似。JDBC 编写的代码,可以访问不同的数据库,比如:oracle、sqlserver、mysql等。而 JNDI 编写的代码,可以访问不同的目录或命名服务,比如:LDAP、DNS、JMS 这类命名服务。
使用 JNDI 步骤
- 配置 jndi.perproties 文件;
- 使用 Perproties 对象加载 jndi.perproties 文件;
- 使用 javax.naming.InitialContext 对象初始化;
- 使用 javax.naming.Context 对象 lookup 方法加载命名服务;
代码示例(依赖ActiveMQ环境)
配置文件——jndi.perproties,在项目resources目录中。
# jms provider setting
java.naming.factory.initial=org.apache.activemq.jndi.ActiveMQInitialContextFactory
java.naming.provider.url=tcp://localhost:61616
# application setting
connectionFactoryNames=TopicCF
topic.topic1 = jms.topic1
JNDI工厂类初始化Context对象
package com.smart.jndi;
import javax.naming.Context;
import javax.naming.InitialContext;
import javax.naming.NamingException;
import java.util.Properties;
public class JndiFactory {
private Context context = null;
private void initialize() throws NamingException {
Properties props = new Properties();
try {
// 默认加载 classes 目录配置文件
props.load(this.getClass().getClassLoader().getResourceAsStream("jndi.properties"));
} catch (Exception ex) {
ex.printStackTrace();
}
// InitialContext 对象初始化事,必现传入加载的 jndi.properties 配置
// 网上搜索的资料,大多是不用传入 Properties 对象的。但是尝试过,不能初始化
// 查看 InitialContext 源码,发现如果不传入 Properties 对象
// 则默认创建长度为 7 的 HashTable 对象,里面没有 jndi 配置信息,也就是说获取不到 jndi 服务
context = new InitialContext(props);
}
public Context getJndiContext() throws NamingException {
if (context == null) {
initialize();
}
return context;
}
}
使用JNDI工厂类,获取 jndi 服务
import com.smart.jndi.JndiFactory;
import javax.jms.TopicConnectionFactory;
import javax.naming.Context;
import java.util.Hashtable;
public class Launcher {
public static void main(String[] args) throws Exception {
System.out.println("Launcher");
JndiFactory jndiFactory = new JndiFactory();
Context context = jndiFactory.getJndiContext();
Hashtable<String, String> env = (Hashtable<String, String>) context.getEnvironment();
System.out.println("配置信息输出:");
for (String key : env.keySet()) {
System.out.println(String.format("key: %s, value: %s", key, env.get(key)));
}
TopicConnectionFactory connectionFactory =
(TopicConnectionFactory) context.lookup("TopicCF");
System.out.println("获取到TopicConnectionFactory:" + (null != connectionFactory));
}
}
运行
运行结果:
依赖
环境依赖:
- jdk 1.8
- activemq 5.15.8(需自行安装服务,官网有安装说明:http://activemq.apache.org )
jar 包依赖,gradle 配置:
dependencies {
compile group: 'javax.jms', name: 'javax.jms-api', version: '2.0.1'
compile group: 'org.apache.activemq', name: 'activemq-all', version: '5.15.8'
testCompile group: 'junit', name: 'junit', version: '4.12'
}