首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >向ibm-mq发送消息时UnSatisfied链接异常

向ibm-mq发送消息时UnSatisfied链接异常
EN

Stack Overflow用户
提问于 2017-04-12 18:04:29
回答 2查看 194关注 0票数 1

我是MQ的新手,我有一个要求,在这里我必须从1个系统向另一个系统发送mq消息。消息队列和队列管理器是在服务器上设置的,我只有qname和mqmanager名称,我编写了以下代码来创建到mq的连接,但是我得到了这个异常:UnsatisfiedLinkError: mqjbnd (不在java.library.path中)

守则是:

代码语言:javascript
复制
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(););
        }
    }
}

有人能帮我一下吗。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2017-04-12 22:18:12

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

如果您的应用程序运行在与IBM队列管理器相同的服务器上,则需要告诉客户端如何使用以下方法之一查找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队列管理器,我同意@ need 7790438,您需要向MQ提供有关如何连接到远程队列管理器的详细信息。MQEnvironment是全局的,而不是线程安全的。您应该使用哈希表来传递这些值,例如:

代码语言:javascript
复制
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,也没有提到您所引用的Java文件的IBM类的版本。其他细节可以通过哈希表传递,例如,如果您使用IBM v8或更高版本的v8类,并连接到IBM v8或更高版本的队列管理器,您可能需要传递一个UserID和密码,这将通过向has表添加以下内容来实现:

代码语言:javascript
复制
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);

请注意,根据IBMv9.0知识中心页面"不推荐、稳定和删除的功能",IBM类在v8.0时已经稳定下来。这意味着将不再进行进一步的增强,最终IBM将不再推荐IBM类用于Java。您可能希望使用IBM类编写应用程序,因为JMS没有任何支持限制。

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

票数 2
EN

Stack Overflow用户

发布于 2017-04-12 18:16:19

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

只需尝试添加以下内容:

代码语言:javascript
复制
MQEnvironment.hostname = "mq hostname";
MQEnvironment.channel = "mq channel";

在此之前:

代码语言:javascript
复制
MQQueueManager qMgr = new MQQueueManager(qManager);
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/43376642

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档