Java 用JMS访问MQ

Java 用JMS访问MQ,java,jakarta-ee,jms,ibm-mq,Java,Jakarta Ee,Jms,Ibm Mq,我正在使用MQ7并尝试使用JMS api访问队列。获取此错误。 以前有人见过吗?我如何解决这个问题?短暂性脑缺血发作 线程“main”com.ibm.msg.client.jms.detailedjmscexception中的异常: JMSFMQ6312:Java(tm)MQI中发生异常。Java(tm)MQI引发了一个描述该问题的异常。有关更多信息,请参阅链接的异常 原因:com.ibm.mq.jmqi.jmqi异常:CC=2;RC=2495;AMQ8568:未找到本机JNI库“mqjbnd”

我正在使用MQ7并尝试使用JMS api访问队列。获取此错误。 以前有人见过吗?我如何解决这个问题?短暂性脑缺血发作

线程“main”com.ibm.msg.client.jms.detailedjmscexception中的异常: JMSFMQ6312:Java(tm)MQI中发生异常。Java(tm)MQI引发了一个描述该问题的异常。有关更多信息,请参阅链接的异常

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

原因:java.lang.UnsatisfiedLinkError:java.library.path中没有mqjbnd


这几乎总是由不完整的客户端安装和/或类路径问题共同导致的。许多人获取jar文件而不是执行完整的安装,并且不一定获取所有jar文件。除了确保所有必需的二进制文件都存在外,使用安装介质还提供了一些附加功能,如诊断和跟踪。它还确保可以进行维护。WMQ客户端安装介质可作为免费下载。类路径设置应如手册中所述


如果客户机安装是从IBM介质执行的,并且环境是按照文档设置的,那么这几乎修复了您在这里报告的所有情况。有一些安装验证测试应用程序(其中一些诊断程序是使用我提到的完整介质安装的),可以帮助确定是安装问题还是代码问题。

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

可能有点晚,但我遇到了相同的问题,发现如果在连接到远程队列时使用不同的连接模式,可以避免这种情况。默认情况下,
MQConnectionFactory
使用
WMQ\u CM\u绑定作为其连接模式。如果您将其更改为
WMQ\u CM\u 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)));
}

同意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>

....

问题在于系统属性上的Path变量。尝试通过在MQInstallation Dir:\Lib之前指定MQInstallation Dir:\Lib64 path来运行代码将以下内容添加到tomcat参数中:

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

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

场景是我使用java程序通过JMS访问部署在单独机器上的MQ队列,因此我从服务器获得了所有必需的MQ客户端LIB,奇怪之处在于,同一个程序在服务器上完美运行,MQ在类路径中使用相同的JAR部署,这可能与java.library.path prop有关,还有其他想法吗错误消息清楚地表明java.library.path缺少mqjbnd。如果您转到它工作的服务器,我相信您会发现它的java.library.path设置正确。我敢肯定,如果你的安装和你的一样,它就会工作。这就是IBM不支持这种安装的原因。如果使用MQC7 SupportPac安装客户端,则可以获得所有必需的LIB和JAR以及诊断实用程序。根据您的评论,安装介质使用的地方,它可以工作。为什么不使用文档化和支持的过程来安装客户端libs?然后,如果需要,您可以打开PMR并应用维护。或者这些东西对您的应用程序不重要吗?当客户机和服务器位于同一台机器上,但不在单独的机器上时,它就工作了。或者从我的角度来看,它工作在运行IBM安装介质的机器上,而不是通过复制安装JAR的机器上。作为一名专门从事WMQ的IBM顾问,我经常看到这一点。我让客户机做的第一件事是按照文档运行支持的安装。这可以修复80%~90%的问题,例如您正在报告的问题。如果您不愿意在客户端计算机上运行安装介质,我将无法进一步帮助您。如果完整安装仍然无法运行,我会要求查看初始验证测试程序的输出运行情况。作为一个也在努力解决此问题的人,我想澄清切换到WMQ_CM_客户端是必要的,但还不够。我还需要在我的库jar集中包含“com.ibm.mq.jmqi.jar”。只是为了提供信息,这反过来又引入了jms.jar、com.ibm.mq.headers.jar和com.ibm.mq.jar。不过,我仍然看到(其他)问题,因此可能需要更多的罐子。