【问题标题】:Websphere MQ unable to create initial JNDI contextWebsphere MQ 无法创建初始 JNDI 上下文
【发布时间】:2015-02-20 16:58:20
【问题描述】:

我正在尝试在“websphere 安装位置”\tools\jms\samples 运行 Websphere MQ 7.0 安装附带的演示类 (JMSJNDIProducer.java)。我已经启动并运行了 Websphere,下面是我的 websphere 配置...

  • 队列管理器名称:JMSDEMO
  • 队列管理器端口:1414
  • 频道(默认):SYSTEM.DEF.CLNTCONN
  • 队列名称:JMSDEMO.QL
  • 如果需要更多信息,请告诉我...

我的代码在初始上下文创建期间失败,我对 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

【问题讨论】:

    标签: java jms ibm-mq


    【解决方案1】:

    私有静态字符串 initialContextUrl = "tcp://localhost:1414";

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

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

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

    即使用 MQ Explorer 并选择“JMS Administered Objects”,然后执行基于文件的 JNDI。

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

    【讨论】:

    • 我确实很困惑,但我认为您为我指明了正确的方向。我在 WebSphere mq 中创建了一个基于文件的管理对象,但我有点期待在文件位置生成一个 jndi 文件。我需要创建一个 .bindings 文件吗?
    • 您是否选择了“文件系统”? (在“添加初始上下文”之后)然后填写“绑定目录”字段。这是添加 QCF(s) 和 Queue(s) 后“.bindings”文件所在的位置。即C:\JNDI-目录\roger\mqjndi\
    • 然后在您的程序中将您的 initialContectURL 设置为: private static String initialContextUrl = "file://C:/JNDI-Directory/roger/mqjndi");
    • 我使用 Websphere MQ Explorer 创建管理对象,创建连接工厂对象和目标对象。受管对象位置是 C:/Users/Desktop/jndi,其中有一个 .bindings 文件。我尝试将 JmsJndiProducer.java 示例中的 C:/Users/Desktop/jndi 作为 initialContextURl 传递,但我得到 Root 异常是 java.net.MalformedURLException: unknown protocol: c]
    • 忘记了文件路径前面的文件:\\,我想这是需要的:)
    【解决方案2】:

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

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

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

    建议查看Oracle's JNDI tutorial ..

    【讨论】:

      猜你喜欢
      • 2019-07-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-02-06
      • 1970-01-01
      相关资源
      最近更新 更多