Java 使用 JNDI 服务

2 篇文章 0 订阅
1 篇文章 0 订阅

JNDI 简述

JNDI 是一个标准的 java 扩展,它提供了一个统一的 API,用于访问多种目录和命名服务。在这方面,它和 JDBC 有点类似。JDBC 编写的代码,可以访问不同的数据库,比如:oracle、sqlserver、mysql等。而 JNDI 编写的代码,可以访问不同的目录或命名服务,比如:LDAP、DNS、JMS 这类命名服务。

使用 JNDI 步骤

  1. 配置 jndi.perproties 文件;
  2. 使用 Perproties 对象加载 jndi.perproties 文件;
  3. 使用 javax.naming.InitialContext 对象初始化;
  4. 使用 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));
        
    }
}

运行

运行结果:
在这里插入图片描述

依赖

环境依赖:

  1. jdk 1.8
  2. 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'
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值