2010-09-09 17 views
8

sto utilizzando MQ7 e sto tentando di accedere a una coda con API JMS. Ottenere questo errore. Qualcuno l'ha visto prima? Come risolvo questo? TIAAccesso a MQ con JMS

Exception in thread "main" com.ibm.msg.client.jms.DetailedJMSException: JMSFMQ6312: An exception occurred in the Java(tm) MQI. The Java(tm) MQI has thrown an exception describing the problem. See the linked exception for further information.

Caused by: com.ibm.mq.jmqi.JmqiException: CC=2;RC=2495;AMQ8568: The native JNI library 'mqjbnd' was not found. [3=mqjbnd]

Caused by: java.lang.UnsatisfiedLinkError: no mqjbnd in java.library.path

risposta

3

Questo è quasi sempre causato da una combinazione di un client incompleta installare e o un problema/CLASSPATH. Molte persone catturano i file jar invece di eseguire l'installazione completa e non li ottengono necessariamente tutti. Oltre a garantire la presenza di tutti i binari richiesti, l'utilizzo del supporto di installazione offre diverse funzionalità aggiuntive come diagnostica e traccia. Garantisce inoltre che la manutenzione possa essere applicata. Il supporto di installazione del client WMQ è disponibile per il download gratuito come SupportPac MQC7. L'impostazione CLASSPATH dovrebbe essere come descritto nel manuale WebSphere MQ Using Java.

Se l'installazione del client viene eseguita dal supporto IBM e l'ambiente è impostato in base ai documenti, questo risolve quasi tutti i casi come quelli riportati qui. Esistono alcune app di verifica di installazione (alcune di quelle diagnostiche installate con il supporto completo che ho menzionato) which are described here e che possono aiutare a determinare se un problema riguarda l'installazione o il codice.

+0

Lo scenario è che sto usando un programma java per accedere a una coda MQ distribuita su una macchina separata tramite JMS, quindi ho ottenuto tutte le librerie richieste del client MQ dal server, la stranezza sta nel fatto che lo stesso programma funziona perfettamente sul server in cui MQ è distribuito con gli stessi jar in classpath, potrebbe essere che abbia qualcosa a che fare con java.library.path prop, altre idee. :) – hakish

+0

Il messaggio di errore dice chiaramente che java.library.path manca mqjbnd. Se vai al server su cui funziona, sono sicuro che troverai java.library.path impostato correttamente. Rendi il tuo uguale e funzionerà, ne sono sicuro. – duffymo

+0

Questo è il motivo per cui IBM non supporta questo tipo di installazione. Se si utilizza il SupportPac MQC7 per installare il client, si ottengono * tutti * i librerie e le librerie richieste, nonché le utilità di diagnostica.Secondo il tuo commento, l'unico posto in cui è stato utilizzato il supporto di installazione, funziona. Perché non utilizzare la procedura documentata e supportata per installare le librerie client? Quindi è possibile aprire PMR se necessario e applicare la manutenzione. O queste cose non sono importanti per la tua applicazione? –

1

Il parametro VM -Djava.library.path=/opt/mqm/java/lib64 funziona per me. Il mio ambiente è Suse a 64 bit con MQ installato e il mio programma utilizza il tipo di trasporto "Bindings"

6

Probabilmente un po 'in ritardo ma ho avuto lo stesso problema e ho scoperto che questo può essere evitato se si utilizza una Modalità di connessione diversa quando ci si connette a un coda remota. Per impostazione predefinita, MQConnectionFactory utilizza WMQ_CM_BINDINGS come modalità di connessione. Se lo cambi in WMQ_CM_CLIENT (o qualsiasi altra modalità di connessione che ti piace non richiede librerie native) dovresti stare bene.

@Test 
public void testMQConnectionMode() throws JMSException { 
    MQConnectionFactory cf = new MQConnectionFactory(); 
    assertThat(cf.getIntProperty(CommonConstants.WMQ_CONNECTION_MODE), is(equalTo(CommonConstants.WMQ_CM_BINDINGS))); 
    cf.setIntProperty(CommonConstants.WMQ_CONNECTION_MODE, CommonConstants.WMQ_CM_CLIENT); 
    assertThat(cf.getIntProperty(CommonConstants.WMQ_CONNECTION_MODE), is(equalTo(CommonConstants.WMQ_CM_CLIENT))); 
} 
+0

Come qualcuno che sta lottando con questo problema, vorrei chiarire che il passaggio a WMQ_CM_CLIENT è necessario ma non sufficiente. Avevo anche bisogno di includere "com.ibm.mq.jmqi.jar" nel mio set di giare della libreria. Solo per informazioni, questo a sua volta richiama jms.jar, com.ibm.mq.headers.jar e com.ibm.mq.jar. Sto ancora vedendo (altri) problemi, però, potrebbero essere necessari più vasi. –

2

d'accordo con Johnam, è successo perché la ConnectionFactory impostato come server di default, ha bisogno di essere impostato come client, lei ha detto che funziona su stessa macchina. Poiché ho incontrato anche la stessa situazione, viene eseguito sulla stessa macchina, in questo caso perché la macchina è come WMQ Server, quindi esegui il programma, ma quando esegui su una macchina diversa, il tuo programma deve essere impostato come client.

ho fissarlo con impostare alcuni parametri sul ConnectionFactory:

<bean id="mqConnectionFactory" class="com.ibm.mq.jms.MQConnectionFactory"> 
.... 
<property name="transportType" value="1" /> 
<property name="clientReconnectTimeout" value="2" /> 
<property name="clientReconnectOptions" value="0" /> 
</bean> 
0

Il problema è con la variabile Percorso sulla proprietà del sistema. Provare a eseguire il codice specificando MQInstallation Dir: percorso \ lib64 prima MQInstallation Dir: \ Lib

0

Aggiungi il sotto ai tuoi argomenti Tomcat:

-Djava.library.path="C:\Program Files (x86)\IBM\WebSphere MQ\java\lib64" 

Se la directory di installazione è diverso da quello di cui sopra, utilizzare l'appropriato Posizione.