2017-04-12 4 views
1

Ich bin neu in MQ, ich habe eine Anforderung, wo ich eine mq-Nachricht von 1 System zu einem anderen senden muss. Die Nachrichtenwarteschlange und der Warteschlangenmanager sind auf dem Server eingerichtet, und ich habe nur den Namen qname und den mqmanager, ich habe den folgenden Code geschrieben, um eine Verbindung zu mq herzustellen, aber ich bekomme diese Ausnahme: UnzufriedenerLinkError: mqjbnd (nicht in java.library.path gefunden)Unzufriedene Link-Ausnahme Beim Senden einer Nachricht an ibm-mq

Der Code ist:

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

kann jemand bitte mir dabei helfen.

Antwort

1

UnsatisfiedLinkError: mqjbnd (Not found in java.library.path) Fehler wird in der Regel verursacht, wenn Sie versuchen, eine Bindungsmodus Verbindung mit IBM MQ Queue Manager auf demselben Server gehostet zu machen und Die IBM MQ-Klassen für Java können die Bibliothek mqjbnd nicht finden. Wenn Sie keinen Hostnamen und Kanalnamen für IBM MQ-Klassen angeben, die Java für die Verbindung verwenden soll, wird standardmäßig eine Verbindung im Bindungsmodus verwendet.

Wenn Ihre Anwendungen auf demselben Server wie der IBM MQ-Warteschlangenmanager ausgeführt werden, müssen Sie dem Client mitteilen, wie die mqjbnd-Bibliotheken (unter Linux ist dies/opt/mqm/java/lib) mit einem der folgenden Knoten gefunden werden folgende Methoden:

  1. setzen Sie die Umgebungsvariable LIBPATH zum Beispiel auf Linux-bash export LIBPATH=/path/to/library
  2. mit der Kommandozeilenoption -Djava.library.path=/path/to/library
  3. Programmatically mit System.setProperty("java.library.path", "/path/to/library");

Wenn Sie versuchen, eine Verbindung zu einem auf einem Remote-Server gehosteten IBM MQ Queue Manager herzustellen, stimme ich @ user7790438 zu, dass Sie MQ die Details zum Herstellen einer Verbindung zum fernen WS-Manager mitteilen müssen. Die MQEnvironment ist global und nicht threadsicher. Sie sollten eine Hash-Tabelle verwenden, um diese Werte zum Beispiel passieren:

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); 

Sie erwähnen nicht, welche Version von IBM MQ der WS-Manager ist, oder welche Version von IBM MQ-Klassen für Java-JAR-Dateien Sie verweisen . Weitere Details können über die Hash-Tabelle übergeben werden. Wenn Sie beispielsweise IBM MQ v8 oder spätere Klassen für Java verwenden und eine Verbindung mit einem IBM MQ v8 oder späteren Queue Manager herstellen, müssen Sie möglicherweise eine Benutzer-ID und ein Kennwort übergeben die Zugabe auf folgendes Tabelle:

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); 

Bitte beachten Sie, dass pro IBM v9.0 Wissenscenter Seite „Deprecated, stabilized and removed features“, IBM MQ-Klassen für Java haben Stabilisierung gewesen als von v8.0. Dies bedeutet, dass keine weiteren Verbesserungen vorgenommen werden und IBM schließlich die IBM MQ-Klassen für Java nicht weiter unterstützt.Möglicherweise möchten Sie Ihre Anwendung mithilfe der IBM MQ-Klassen für JMS schreiben, für die keine Supportbeschränkungen gelten.

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

Hallo Josh danke für Ihre Erklärung. Die MQ-Version ist 7. Da die Warteschlange auf dem Server ist gibt es eine andere Möglichkeit, die ich auf die Warteschlange wie JNDI-Lookup zugreifen kann. können Sie mir bitte in die richtige Richtung zeigen. –

+0

@FAIZANAHMEDKHAN Ich habe oben einen Beispielcode zur Angabe der Details des Remote-Servers angegeben, den Sie von Ihrem MQ-Administrator erhalten müssen. – JoshMc

+0

okay. Noch eine Frage, brauche ich einen lokalen Server, der wie jboss oder tomcat auf meiner Maschine läuft? Da sich die Anwendung, die versucht, sich mit MQ und dem MQ zu verbinden, an zwei verschiedenen physischen Standorten befindet? –

0

Sie haben MQQueueManager instanziiert, bevor Sie den Hostnamen und Kanal von MQEnvironment festlegen.

Versuchen Sie einfach, fügen Sie diese:

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

Bevor:

MQQueueManager qMgr = new MQQueueManager(qManager); 
Verwandte Themen