我是MQ的新手,我有一个要求,我必须从一个系统发送一个mq消息到另一个系统。消息队列和队列管理器是在服务器上设置的,我只有qname和mqmanager名称,我编写了以下代码来创建与mq的连接,但是我得到了这个异常: UnsatisfiedLinkError:mqjbnd(在java.library.path中找不到)
代码是:
package com.demo.mqsamplimport com.ibm.mq.MQC;
import com.ibm.mq.MQEnvironment;
import com.ibm.mq.MQException;
import com.ibm.mq.MQGetMessageOptions;
import com.ibm.mq.MQMessage;
import com.ibm.mq.MQPutMessageOptions;
import com.ibm.mq.MQQueue;
import com.ibm.mq.MQQueueManager;
import com.ibm.mq.constants.MQConstants;
public class MQSample {
private static final String qManager = "(MyQueueManagerName)";
private static final String qName = "(MyQueueName)";
public static void putGet(String args[]) {
try {
MQQueueManager qMgr = new MQQueueManager(qManager);
int openOptions = MQConstants.MQOO_OUTPUT;
MQQueue queue = qMgr.accessQueue(qName, openOptions);
MQMessage msg = new MQMessage();
msg.writeString("Hello World!");
MQPutMessageOptions pmo = new MQPutMessageOptions();
queue.put(msg, pmo);
}
catch (MQException ex) {
ex.printstacktrace();
}
catch (java.io.IOException ex) {
ex.printstacktrace(););
}
}
}
任何人都可以帮助我。
答案 0 :(得分:2)
UnsatisfiedLinkError: mqjbnd (Not found in java.library.path)
错误。如果没有为IBM MQ Classes for Java指定用于连接的主机名和通道名,则它们默认为绑定模式连接。
如果您的应用程序在与IBM MQ Queue Manager相同的服务器上运行,那么您需要告诉客户端如何使用以下方法之一找到mqjbnd库(在Linux上这是/ opt / mqm / java / lib)方法:
export LIBPATH=/path/to/library
-Djava.library.path=/path/to/library
System.setProperty("java.library.path", "/path/to/library");
如果您尝试连接到远程服务器上托管的IBM MQ队列管理器,我同意@ user7790438您需要向MQ提供有关如何连接到远程队列管理器的详细信息。 MQEnvironment是全局的,而不是线程安全的。您应该使用哈希表来传递这些值,例如:
import java.util.Hashtable;
private static String host = "dns.name";
private static int port = 1414;
private static String channel = "MQ.SVRCONN.CHL";
Hashtable properties = new Hashtable<String, Object>();
properties.put("hostname", host);
properties.put("port", port);
properties.put("channel", channel);
MQQueueManager qMgr = new MQQueueManager(qManager, properties);
您没有提到队列管理器的IBM MQ版本,或者您引用的Java jar文件的IBM MQ类的版本。其他详细信息可以通过哈希表传递,例如,如果您使用IBM MQ v8或更高版本的Classes for Java并连接到IBM MQ v8或更高版本的队列管理器,则可能需要传递用户ID和密码,这可以通过以下方式完成:将以下内容添加到has表中:
private static String user = "UserID";
private static String password = "Password";
properties.put(MQConstants.USE_MQCSP_AUTHENTICATION_PROPERTY, true);
properties.put(MQConstants.USER_ID_PROPERTY, user);
properties.put(MQConstants.PASSWORD_PROPERTY, password);
请注意,根据IBM v9.0知识中心页面“Deprecated, stabilized and removed features”,IBM MQ Classes for Java自v8.0起一直是Stabilization。这意味着不会进一步增强,最终IBM将弃用IBM MQ Classes for Java。您可能希望使用没有支持限制的JMS IBM MQ类编写应用程序。
IBM MQ类的Java稳定性
IBM不会对Java MQ类的Java进行进一步的增强,它们在IBM MQ V8.0中提供的功能上也是功能稳定的。将继续完全支持使用IBM MQ classes for Java的现有应用程序,但此API已稳定,因此不会添加新功能并拒绝增强功能请求。完全支持意味着缺陷将与IBM MQ系统要求更改所需的任何更改一起修复。
答案 1 :(得分:0)
在设置MQEnvironment的主机名和频道之前,您实例化了MQQueueManager。
试试添加:
MQEnvironment.hostname = "mq hostname";
MQEnvironment.channel = "mq channel";
在:
MQQueueManager qMgr = new MQQueueManager(qManager);