【问题标题】:Remote JNDI lookup using IBM MQ doesn't work使用 IBM MQ 的远程 JNDI 查找不起作用
【发布时间】: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 的原因。如果您编辑您的问题以使您的期望更清晰,那么我可以写一个答案来帮助未来的人寻找相同的信息。

标签: java jms jndi ibm-mq


【解决方案1】:

如果您想从 JBoss EAP 7 连接到 IBM MQ,请使用“文件系统”选项并创建一个 .bindings 文件。然后,您可以将该文件复制到您的 EAP 服务器。

然后你可以从 JBoss EAP 引用那个 .binding 文件:

    <subsystem xmlns="urn:jboss:domain:naming:2.0">
        <bindings>
            <external-context name="java:global/MQBindings" module="com.ibm.wmqclient75" class="javax.naming.InitialContext" cache="true">
                <environment>
                    <property name="java.naming.factory.initial" value="com.sun.jndi.fscontext.RefFSContextFactory"/>
                    <property name="java.naming.provider.url" value="file:///${jboss.server.data.dir}/bindings/"/>
                    <property name="java.naming.security.authentication" value="none"/>
                </environment>
            </external-context>
        </bindings>
        <remote-naming/>
    </subsystem>

请注意,我将 IBM JNDI 映射到“java:global/MQBindings”。 “java:jboss/MQBindings”之类的东西也可以。 “.bindings”文件位于“file:///${jboss.server.data.dir}/bindings/”目录中。

此命名上下文使用“com.ibm.wmqclient75”模块。模块 module.xml 文件:

<?xml version="1.0" encoding="UTF-8"?>
<module xmlns="urn:jboss:module:1.3" name="com.ibm.wmqclient75">
<resources>
<resource-root path="com.ibm.mq.commonservices.jar" />
<resource-root path="com.ibm.mq.headers.jar" />
<resource-root path="com.ibm.mq.jar" />
<resource-root path="com.ibm.mq.jmqi.jar" />
<resource-root path="com.ibm.mqjms.jar" />
<resource-root path="com.ibm.mq.pcf.jar" />

<resource-root path="connector.jar" />
<resource-root path="dhbcore.jar" />
<resource-root path="fscontext.jar"/>
<resource-root path="providerutil.jar"/>
</resources>

<dependencies>
   <!-- add the dependencies required by JMS Bridge code -->
   <module name="javax.api"/>
   <module name="javax.resource.api"/>
   <module name="javax.jms.api"/>
   <module name="javax.transaction.api"/>
   <module name="org.jboss.remote-naming"/>
   <!-- we depend on org.hornetq module since we will send messages to     -->
   <!-- the HornetQ server embedded in the local AS7 instance          
   <module name="org.hornetq"/>  -->
</dependencies>

引用的 jar 文件可以在 IBM MQ 安装中找到。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-02-22
    • 2018-05-16
    • 2016-06-23
    • 1970-01-01
    • 2022-08-19
    相关资源
    最近更新 更多