繁体   English   中英

向ibm-mq发送消息时不满意的链接异常

[英]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(););
        }
    }
}

谁能帮我这个忙。

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

如果您的应用程序与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");编程方式进行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或更高版本的Queue Manager,则可能需要传递UserID和密码,这可以通过以下方式实现:将以下内容添加到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知识中心页面“ 已弃用,稳定和删除的功能 ”,从v8.0开始,用于Java的IBM MQ类已稳定。 这意味着将不再进行进一步的增强,并且最终IBM将弃用Java的IBM MQ类。 您可能想要使用没有支持限制的JMS的IBM MQ类来编写应用程序。

稳定用于Java的IBM MQ类
IBM将不再对Java的IBM MQ类进行进一步的增强,并且它们的功能将稳定在IBM MQ版本8.0中提供的级别。 仍将继续完全支持使用IBM Java MQ类的现有应用程序,但此API已稳定,因此将不会添加新功能并且拒绝增强请求。 完全受支持意味着可以将缺陷与IBM MQ系统需求更改所必需的任何更改一起修复。

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

只需尝试添加以下内容:

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

之前:

MQQueueManager qMgr = new MQQueueManager(qManager);

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM