【问题标题】:Accessing MQ with JMS使用 JMS 访问 MQ
【发布时间】:2011-04-10 04:56:51
【问题描述】:

我正在使用 MQ7 并尝试使用 JMS api 访问队列。收到此错误。 有人见过吗?我该如何解决这个问题? TIA

线程“主”com.ibm.msg.client.jms.DetailedJMSException 中的异常: JMSFMQ6312:Java(tm) MQI 中发生异常。 Java(tm) MQI 已引发描述该问题的异常。有关详细信息,请参阅链接的异常。

原因:com.ibm.mq.jmqi.JmqiException: CC=2;RC=2495;AMQ8568: 未找到本机 JNI 库“mqjbnd”。 [3=mqjbnd]

原因:java.lang.UnsatisfiedLinkError: no mqjbnd in java.library.path

【问题讨论】:

    标签: java jakarta-ee jms ibm-mq


    【解决方案1】:

    将以下内容添加到您的 tomcat 参数中:

    -Djava.library.path="C:\Program Files (x86)\IBM\WebSphere MQ\java\lib64"
    

    如果安装目录与上述不同,请使用适当的位置。

    【讨论】:

      【解决方案2】:

      问题在于系统属性上的路径变量。尝试通过在 MQInstallation Dir:\Lib 之前指定 MQInstallation Dir:\Lib64 路径来运行代码

      【讨论】:

        【解决方案3】:

        同意Johnam,这是因为ConnectionFactory默认设置为服务器,需要设置为客户端,你说它在同一台机器上工作。因为我也遇到过同样的情况,它是在同一台机器上运行的,在这种情况下,因为你的机器是WMQ服务器所以程序也是如此,但是当你在不同的机器上运行时,你的程序必须设置为客户端。

        我通过在 ConnectionFactory 上设置一些参数来修复它:

        <bean id="mqConnectionFactory" class="com.ibm.mq.jms.MQConnectionFactory">
        ....
        <property name="transportType" value="1" />
        <property name="clientReconnectTimeout" value="2" /> 
        <property name="clientReconnectOptions" value="0" />
        </bean>
        

        【讨论】:

          【解决方案4】:

          可能有点晚了,但我遇到了同样的问题,发现如果在连接到远程队列时使用不同的连接模式,可以避免这种情况。默认情况下,MQConnectionFactory 使用 WMQ_CM_BINDINGS 作为连接模式。如果您将其更改为WMQ_CM_CLIENT(或您喜欢的不需要本机库的任何连接模式),您应该没问题。

          @Test
          public void testMQConnectionMode() throws JMSException {
              MQConnectionFactory cf = new MQConnectionFactory();
              assertThat(cf.getIntProperty(CommonConstants.WMQ_CONNECTION_MODE), is(equalTo(CommonConstants.WMQ_CM_BINDINGS)));
              cf.setIntProperty(CommonConstants.WMQ_CONNECTION_MODE, CommonConstants.WMQ_CM_CLIENT);
              assertThat(cf.getIntProperty(CommonConstants.WMQ_CONNECTION_MODE), is(equalTo(CommonConstants.WMQ_CM_CLIENT)));
          }
          

          【讨论】:

          • 作为一个也在努力解决这个问题的人,我想澄清一下,切换到 WMQ_CM_CLIENT 是必要的,但还不够。我还需要在我的库 jar 集中包含“com.ibm.mq.jmqi.jar”。仅供参考,这又会引入 jms.jar、com.ibm.mq.headers.jar 和 com.ibm.mq.jar。不过,我仍然看到(其他)问题,因此可能需要更多的罐子。
          【解决方案5】:

          VM 参数-Djava.library.path=/opt/mqm/java/lib64 适合我。我的环境是安装了 MQ 的 64 位 Suse,我的程序使用的是“绑定”传输类型

          【讨论】:

            【解决方案6】:

            这几乎总是由不完整的客户端安装和/或 CLASSPATH 问题共同引起的。许多人获取 jar 文件而不是执行完整的安装,并且不一定获得所有这些文件。除了确保所有必需的二进制文件都存在之外,使用安装媒体还提供了一些附加功能,例如诊断和跟踪。它还确保可以应用维护。 WMQ 客户端安装媒体可通过SupportPac MQC7 免费下载。 CLASSPATH 设置应如WebSphere MQ Using Java 手册中所述。

            如果从 IBM 媒体执行客户端安装并按照文档设置环境,这几乎可以修复您在此处报告的所有情况。有一些安装验证测试应用程序(其中一些诊断程序是使用我提到的完整媒体安装的)which are described here,它们可以帮助确定是安装问题还是代码问题。

            【讨论】:

            • 场景是我使用java程序通过JMS访问部署在单独机器上的MQ队列,所以我从服务器获得了所有需要的MQ客户端库,奇怪的是相同的程序在使用类路径中相同的 jar 部署 MQ 的服务器上完美运行,可能与 java.library.path 道具有关,还有更多想法。 :)
            • 错误信息明确表示 java.library.path 缺少 mqjbnd。如果你去它工作的服务器,我相信你会发现它的 java.library.path 设置正确。我敢肯定,让你的也一样,它会起作用的。
            • 这是 IBM 不支持此类安装的原因。如果您使用 MQC7 SupportPac 安装客户端,那么您将获得所有所需的库和 jar 以及诊断实用程序。根据您的评论,使用安装媒体的地方,它可以工作。为什么不使用记录和支持的过程来安装客户端库?然后,您可以根据需要打开 PMR 并进行维护。还是这些东西对您的应用程序不重要?
            • 当客户端和服务器位于同一台机器上时,它可以工作,但不是分开的..
            • 或者从我的角度来看,它可以在运行 IBM 安装媒体的机器上运行,而不是在通过复制它们来安装 jar 的机器上运行。作为专门研究 WMQ 的 IBM 顾问,我经常看到这一点。我让客户做的第一件事是按照文档运行支持的安装。这解决了您报告的 80% ~ 90% 的问题。如果您不愿意在客户端计算机上运行安装媒体,我将无法进一步帮助您。如果完整安装后仍然无法正常工作,我会要求查看初始验证测试程序运行的输出。
            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 2017-04-14
            • 2011-06-15
            • 2010-10-28
            • 1970-01-01
            • 2012-05-12
            • 2023-03-05
            • 2019-06-10
            相关资源
            最近更新 更多