Websphere MQ 无法创建初始 JNDI 上下文

Websphere MQ unable to create initial JNDI context

我正在尝试 运行 Websphere MQ 7.0 安装附带的演示 class (JMSJNDIProducer.java) 'websphere installation location'\tools\jms\samples。我启动了 Websphere 并 运行ning,下面是我的 websphere 配置...

我的代码在初始上下文创建期间失败,我对 Websphere MQ 很陌生,不确定 initialContextUrl 需要是什么?

public class JMS_JNDI_Websphere_Sample {

private static String initialContextUrl = "tcp://localhost:1414";

public static void main(String args[]) {

    // Instantiate the initial context
    String contextFactory = "com.sun.jndi.fscontext.RefFSContextFactory";
    Hashtable<String, Object> environment = new Hashtable<String, Object>();
    environment.put(Context.INITIAL_CONTEXT_FACTORY, contextFactory);
    environment.put(Context.PROVIDER_URL, initialContextUrl);
    try {
        Context context = new InitialDirContext(environment);
    } catch (NamingException e) {
        e.printStackTrace();
    }
    System.out.println("Initial context found!");

}
}

我遇到以下异常。

    javax.naming.InvalidNameException: tcp://localhost:1414 [Root exception is java.net.MalformedURLException: unknown protocol: tcp]
    at com.sun.jndi.fscontext.FSContextFactory.getFileNameFromURLString(FSContextFactory.java:119)
    at com.sun.jndi.fscontext.RefFSContextFactory.createContext(RefFSContextFactory.java:41)
    at com.sun.jndi.fscontext.RefFSContextFactory.createContextAux(RefFSContextFactory.java:47)
    at com.sun.jndi.fscontext.FSContextFactory.getInitialContext(FSContextFactory.java:49)
    at javax.naming.spi.NamingManager.getInitialContext(NamingManager.java:667)
    at javax.naming.InitialContext.getDefaultInitCtx(InitialContext.java:288)
    at javax.naming.InitialContext.init(InitialContext.java:223)
    at javax.naming.InitialContext.<init>(InitialContext.java:197)
    at javax.naming.directory.InitialDirContext.<init>(InitialDirContext.java:82)
    at com.hcsc.jms.websphere.jndi.JMS_JNDI_Websphere_Sample.main(JMS_JNDI_Websphere_Sample.java:32)
Caused by: java.net.MalformedURLException: unknown protocol: tcp
    at java.net.URL.<init>(URL.java:574)
    at java.net.URL.<init>(URL.java:464)
    at java.net.URL.<init>(URL.java:413)
    at com.sun.jndi.fscontext.FSContextFactory.getFileNameFromURLString(FSContextFactory.java:117)
    ... 9 more

private static String initialContextUrl = "tcp://localhost:1414";

首先,我认为 "tcp" 不是一个有效值,如果是,您是否在端口 1414 上有一些 运行 来回复 JNDI 查找请求?

其次,我认为您混淆了 MQ 端口 1414 和 JNDI 查找。

第三,你为什么不直接按照 JmsJndiProducer.java 中的示例使用基于文件的 JNDI。

即使用 MQ Explorer 和 select "JMS Administered Objects" 然后执行基于文件的 JNDI。

一旦您创建了基于文件的 JNDI,那么该值将用于您的初始上下文。

您需要将 JMS API 提供的消息传递概念与通过 JNDI 查找对象分开。正如罗杰所说,问题是 MQ 侦听器和 JNDI 之间的混淆 URL

JNDI 分为用于在目录中绑定和查找对象的接口以及获取对象并放入某个持久存储的 'service providers'。 com.sun.jndi.fscontext.RefFSContextFactory 是使用文件系统的服务提供者,因此 URL 需要是一个 EXISTING 目录。当对象 'bound' 进入时,将创建 .bindings 文件(如果对象已经存在,则更新)。您不需要创建 .bindings 文件;该文件是由文件系统上下文为您创建的。也不要手动修改它。

通常,您会使用 LDAP 支持的 JNDI 服务提供程序进行生产使用。应用中使用的'lookup' API相同;将改变的是提供者 URL(因为将提供 LDAP 服务器的位置)和可能的对象名称。

建议复习 Oracle's JNDI tutorial ..