向 ibm-mq 发送消息时出现不满意 Link 异常

UnSatisfied Link Exception While sending a message to 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(););
        }
    }
}

谁能帮我解决这个问题。

您在设置 MQEnvironment 的主机名和通道之前实例化了 MQQueueManager。

试试添加这个:

MQEnvironment.hostname = "mq hostname";
MQEnvironment.channel = "mq channel";

之前:

MQQueueManager qMgr = new MQQueueManager(qManager);

UnsatisfiedLinkError: mqjbnd (Not found in java.library.path) 错误通常是在您尝试与托管在同一台服务器上的 IBM MQ 队列管理器建立绑定模式连接而 IBM MQ 类 for Java 无法连接时引起的找到库 mqjbnd。如果您没有为 IBM MQ 类 指定主机名和通道名称以供 Java 用于连接,它们默认为绑定模式连接。

如果您的应用程序与 IBM MQ 队列管理器在同一台服务器上运行,那么您需要告诉客户端如何找到 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");

如果您尝试连接到托管在远程服务器上的 IBM MQ 队列管理器,我同意 @user7790438 的观点,即您需要向 MQ 提供有关如何连接到远程队列管理器的详细信息。 MQEnvironment 是全局的并且不是线程安全的。您应该使用散列 table 来传递这些值,例如:

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 类 版本。其他详细信息可以通过散列 table 传递,例如,如果您使用 IBM MQ v8 或更高版本 类 作为 Java 并连接到 IBM MQ v8 或更高版本的队列管理器,您可能需要要传递用户 ID 和密码,可以通过将以下内容添加到 has table:

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”,用于 Java 的 IBM MQ 类 从 v8.0 开始稳定。这意味着将不会进行进一步的增强,最终 IBM 将弃用 IBM MQ 类,改为 Java。您可能希望使用 IBM MQ 类 for JMS 编写您的应用程序,它没有支持限制。

Stabilization of IBM MQ classes for Java
IBM will make no further enhancements to the IBM MQ classes for Java and they are functionally stabilized at the level shipped in IBM MQ Version 8.0. Existing applications that use the IBM MQ classes for Java will continue to be fully supported, but this API is stabilized, so new features will not be added and requests for enhancements rejected. Fully supported means that defects will be fixed together with any changes necessitated by changes to IBM MQ System Requirements.