我正在尝试使用 JMS 访问 MQ 队列。我得到以下
java.lang.UnsatisfiedLinkError: no mqjbnd05 in java.library.path
我路过
-Djava.library.path="C:\Program Files\IBM\WebSphere MQ\java\lib"
在eclipse中运行程序时作为VM参数。这个问题在网上讨论了很多,但没有任何结论。有没有人解决这个问题?TIA。
因为我必须自己处理这个错误;我花了很多时间才找到正确的答案,我想与下一个出现在这个线程中的人分享......
实际上,问题的解决方案非常简单(至少在我的情况下)。它与任何CLASSPATH
或java.library.path
安装问题无关。
我只是忘了切换MQConnectionFactory
到客户端模式。
这必须通过简单地调用来完成
cf.setTransportType(WMQConstants.WMQ_CM_CLIENT);
或者
cf.setTransportType(WMQConstants.WMQ_CM_BINDINGS_THEN_CLIENT);
或任何其他适合您需要的连接类型。
默认情况下,ConnectionFactory 处于“绑定”模式 ( WMQ_CM_BINDINGS
),该模式用于本地服务器安装,正如 IBM 文档中所述:
要以绑定方式连接到队列管理器,用于 JMS 应用程序的 WebSphere MQ 类必须在运行队列管理器的同一系统上运行。
当使用 JNDIXMSC_WMQ_CONNECTION_MODE
或.WMQConstants.WMQ_CONNECTION_MODE
JmsFactoryFactory
这同样适用于其他 ConnectionFactory 类型:MQQueueConnectionFactory
、MQTopicConnectionFactory
、MQXAConnectionFactory
和MQXAQueueConnectionFactory
MQXATopicConnectionFactory
查看 IMB 知识中心以获取有关不同连接/绑定选项的更多信息:
https://www.ibm.com/support/knowledgecenter/SSFKSJ_7.5.0/com.ibm.mq.dev.doc/q031720_.htm https://www.ibm.com/support/knowledgecenter/SSFKSJ_7.5.0/com .ibm.mq.dev.doc/q030560_.htm
您的 CLASSPATH、lib 或 EAR 中可能有一些较旧的 MQ jar 文件。
删除它们,你应该没问题。
不应将 MQ 文件放在 EAR 或 WEB-INF/lib 文件夹中。它们应该在您的应用服务器的类路径中。
我在使用 IBM MQ api 连接时遇到了这个问题。我也没有发现这个问题与类路径有关。
当我MQQueueManager
在设置MQEnvironment
'hostname
和channel
. 只需确保您的代码不这样做,并在设置环境后实例化管理器。就像是..
MQEnvironment.hostname = "mq hostname";
MQEnvironment.channel = "mq channel";
..more code..
this._queueManager = new MQQueueManager(qManager);
(观察到可以在初始化MQEnvironment.port
之后设置MQQueueManager
,但是可能会MQEnvironment
一起初始化所有相关的东西)
如果您实际安装了 MQ Client而不是 MQ Server ,则可能会发生这种情况。
IBM 甚至为此写了一个完整的帮助页面:
WebSphere MQ 客户端安装缺少 mqjb*.dll 文件
问题(摘要)
您安装 WebSphere MQ 客户端并注意到目录中缺少三个 dll
\Program Files\IBM\WebSphere MQ\Java\lib\
。症状
以下 dll 出现在服务器安装的目录中,但不是 Java™ 客户端的一部分:
- 03/17/2003 10:59a 19,456 mqjbdf02.dll
- 03/17/2003 10:59a 57,856 mqjbnd05.dll
- 03/17/2003 10:59a 36,864 MQXAi02.dll
子目录 \jdbc\ 出现在服务器上,但不在客户端计算机上。
- 03/17/2003 10:59a 61,440 jdbcdb2.dll
- 03/17/2003 10:59a 61,440 jdbcora.dll
原因
文件丢失是因为在客户端安装中既不提供也不需要它们。
解决问题
这些文件仅包含在 WebSphere MQ Server 产品中。
这是一个简单的方法:告诉 Java VM 加载 DLL。您的代码是否相似,例如您是否使用System.loadLibrary
加载mqjbnd05.dll
?
如果是 - 它是否在 Eclipse 之外工作,例如从命令行启动应用程序?如果是这种情况,您可以尝试使用该库路径启动整个 Eclipse IDE。
有时我们会遇到包含空格的路径名问题。将 dll 复制到C:\
,将其放在 lib 路径上,然后重试。
啊,就是这个问题,缺少指定的dll。这个博客有一个解决方案。祝你好运!
就我而言,当我设置传输类型时,错误消失了。我正在使用 MQConnectionFactory
mQQueueConnectionFactory.setTransportType( JMSC.MQJMS_TP_CLIENT_MQ_TCPIP);