我正在尝试在'websphere安装位置'\ tools \ jms \ samples下运行Websphere MQ 7.0安装附带的演示类(JMSJNDIProducer.java)。我已经启动并运行了Websphere,下面是我的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
答案 0 :(得分:1)
private static String initialContextUrl =&#34; tcp:// localhost:1414&#34;;
首先,我不会想到&#34; tcp&#34;是一个有效值,如果是,您是否在端口1414上运行某些内容来回复JNDI查找请求?
其次,我认为您将MQ端口1414与JNDI查找混淆。
第三,为什么不按照JmsJndiProducer.java中的示例使用基于文件的JNDI。
即。使用MQ Explorer并选择&#34; JMS Administered Objects&#34;然后做基于文件的JNDI。
创建基于文件的JNDI后,再为初始上下文创建该值。
答案 1 :(得分:1)
您需要分离出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 ..