java - 向 ibm-mq 发送消息时出现 UnSatisfied Link 异常

标签 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(););
        }
    }
}

任何人都可以帮我解决这个问题吗?

最佳答案

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

如果您的应用程序与 IBM MQ 队列管理器在同一台服务器上运行,那么您需要使用以下命令之一告诉客户端如何查找 mqjbnd 库(在 Linux 上为/opt/mqm/java/lib)方法:

  1. 设置 LIBPATH 环境变量,例如在 Linux bash 上 export LIBPATH=/path/to/library
  2. 使用命令行选项-Djava.library.path=/path/to/library
  3. 以编程方式使用 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 或更高版本的 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 开始已稳定化。这意味着不会进行进一步的增强,并且最终 IBM 将弃用 IBM MQ Classes for Java。您可能希望使用没有支持限制的 IBM MQ 类来编写应用程序。

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.

关于java - 向 ibm-mq 发送消息时出现 UnSatisfied Link 异常,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43376642/

相关文章:

ssl - 我们可以重用WebSphere MQ TLS/SSL证书吗?

java - 如何绕过 karaf 中的默认 aries jndi 查找

java - 如何将接口(interface)变量分配给子接口(interface)变量?

java - 字符串内容和 user_input 不允许我输入多个单词

java - HTTP 状态 405 - 此 URL java servlet 不支持 HTTP 方法 POST

jms - Camel jms 到外部 activeMQ 的请求-回复给出 javax.jms.InvalidDestinationException : Cannot publish to a deleted Destination:

java - Spring JMS json消息转换器

用于连接数据库的 Java 桌面应用程序

java - 使用 JMS 的主工作模式

ibm-mq - 将文件加载到 MQ 队列的实用程序