不满意链接异常在发送消息到ibm-mq

问题描述:

我是MQ的新手,我有一个要求,我必须从1系统发送mq消息到另一个系统。消息队列和队列管理器在服务器上设置,并且我只有qname和mqmanager名称,我写了以下代码以创建与mq的连接,但我得到此异常: UnsatisfiedLinkError:mqjbnd(在的java.library.path未找到)不满意链接异常在发送消息到ibm-mq

的代码是:

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)错误通常引起的:

刚刚尝试补充一点:

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

之前IBM MQ Classes for Java无法找到库mqjbnd。如果您未指定IBM MQ 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");

如果您尝试连接到托管在远程服务器上的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或更高版本的Queue Manager,则可能需要传递UserID和Password,这可以通过添加以下的有表:

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类的Java已经稳定为V8.0的。这意味着不会进行进一步的增强,最终IBM将弃用IBM MQ Java for Java。您可能希望使用IBM MQ类的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.

+0

嗨乔希谢谢你的解释。 MQ版本为7. 由于队列位于服务器上,因此有任何其他方式可以像jndi查找那样访问队列。 请你指点我正确的方向。 –

+0

@FAIZANAHMEDKHAN我提供了有关如何指定远程服务器详细信息的示例代码,您需要从MQ管理员那里获取这些信息。 – JoshMc

+0

好的。还有1个问题,我是否需要在我的机器上运行像jboss或tomcat的任何本地服务器?由于试图连接到MQ和MQ的应用程序位于两个不同的物理位置上? –

在设置MQEnvironment的主机名和通道之前,您实例化了MQQueueManager。当您尝试进行绑定模式连接到IBM MQ队列管理器托管在同一台服务器上

MQQueueManager qMgr = new MQQueueManager(qManager);