【发布时间】:2017-11-09 21:12:06
【问题描述】:
我已经在机器 A 中安装了 IBM MQ 服务器 v9,在这个 MQ 服务器中,通过 MQ Explorer,我定义了一个队列管理器和一些队列。我希望通过 JNDI 从运行在另一台机器 B 上的客户端查找此队列管理器及其队列。
因此,通过 MQ Explorer,我尝试在“JMS Administered Objects”中添加初始上下文,对于位于的 JNDI 命名空间,我不想使用 LDAP 服务器或文件系统,我选择“Other”选项(检查下图)并提供com.ibm.ejs.ns.jndi.CNInitialContextFactory(我也试过com.ibm.websphere.naming.WsnInitialContextFactory),提供的url定义为iiop://<machine_A_IP>:2809。
这是客户端代码:
// Instantiate the initial context
Hashtable<String, String> environment = new Hashtable<String, String>();
environment.put(Context.INITIAL_CONTEXT_FACTORY, "com.ibm.websphere.naming.WsnInitialContextFactory");
environment.put(Context.PROVIDER_URL, "iiop://<machine_A_IP>:2809");
Context context = new InitialDirContext(environment);
// Lookup the connection factory
JmsConnectionFactory cf = (JmsConnectionFactory) context.lookup("testConnectionFactory");
“testConnectionFactory”是JMS管理对象中定义的连接工厂。
运行代码时,总是报错:
javax.naming.NameNotFoundException:在上下文中找不到名称“testConnectionFactory” “服务器本地:CELLROOT/SERVERROOT”。失败
!!!!!!!!!!!!!!!!!!更新!!!!!!!!!!!!!!!!!!
经过一番调查,我发现 com.ibm.websphere.naming.WsnInitialContextFactory 确实是特定于 Websphere 应用服务器的。我是直接在java Main 类中测试的,可能这就是我总是失败的原因。
就我而言,我确实需要将客户端部署到 JBoss EAP 7,有没有可以使用的提供程序?
我试图在 IBM 社区中找到一个示例,但一切都与文件系统或 LDAP 服务器有关。
谁能帮帮我?任何建议将不胜感激!
提前致谢。
【问题讨论】:
-
您在使用Other时使用的是什么JNDI?您期望什么来回答您的 JNDI 请求?队列管理器不是 JNDI 存储库,以防您希望它回答?
-
您好 Morag,在创建 JMS 管理对象时,我提供的 JNDI 服务提供者的工厂类是 com.ibm.ejs.ns.jndi.CNInitialContextFactory 或 com.ibm.websphere.naming.WsnInitialContextFactory。我期望的是可以使用 context.lookup 检索连接工厂,然后使用它从队列管理器中检索队列。我通过使用文件系统的方式成功了。
-
我希望文件或 LDAP 都能工作,但你的问题是你不想使用它们中的任何一个,因此我的评论。在不知道您想要发生什么的情况下,很难为您提供答案。您没有说您是否希望队列管理器在“其他”情况下成为您的 JNDI 查找?
-
是的,这就是我想要的,我希望在“其他”情况下通过 JNDI 查找队列管理器,有没有办法做到这一点?
-
好的,正如我在之前的评论中所指出的,队列管理器不能充当 JNDI 存储库。这就是您必须使用文件或 LDAP 的原因。如果您编辑您的问题以使您的期望更清晰,那么我可以写一个答案来帮助未来的人寻找相同的信息。