向ibm-mq

时间:2017-04-12 18:04:29

标签: java jms ibm-mq

我是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(););
        }
    }
}

任何人都可以帮助我。

2 个答案:

答案 0 :(得分:2)

当您尝试与托管在同一服务器上的IBM MQ Queue Manager建立绑定模式连接并且IBM MQ Classes for Java无法找到库mqjbnd时,通常会导致

UnsatisfiedLinkError: mqjbnd (Not found in java.library.path)错误。如果没有为IBM MQ Classes for Java指定用于连接的主机名和通道名,则它们默认为绑定模式连接。

如果您的应用程序在与IBM MQ Queue Manager相同的服务器上运行,那么您需要告诉客户端如何使用以下方法之一找到mqjbnd库(在Linux上这是/ opt / mqm / java / lib)方法:

  1. 例如在Linux bash export LIBPATH=/path/to/library
  2. 上设置LIBPATH环境变量
  3. 使用命令行选项-Djava.library.path=/path/to/library
  4. 以编程方式使用System.setProperty("java.library.path", "/path/to/library");
  5. 如果您尝试连接到远程服务器上托管的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);