2010-09-09 40 views
8

estoy usando MQ7 e intento acceder a una cola con api de JMS. Obteniendo este error ¿Alguien lo ha visto antes? ¿Cómo resuelvo esto? TIAAccediendo 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

Respuesta

3

Esto casi siempre se debe a una combinación de una instalación incompleta del cliente y/o un problema CLASSPATH. Muchas personas toman los archivos jar en lugar de realizar la instalación completa y no necesariamente los obtienen todos. Además de asegurar que todos los binarios necesarios estén presentes, el uso de medios de instalación proporciona varias capacidades adicionales, como diagnósticos y rastreo. También asegura que se puede aplicar el mantenimiento. Los medios de instalación del cliente WMQ están disponibles para su descarga gratuita como SupportPac MQC7. La configuración CLASSPATH debe ser como se describe en el manual WebSphere MQ Using Java.

Si la instalación del cliente se realiza desde los medios de IBM y el entorno está configurado de acuerdo con los documentos, esto soluciona casi todos los casos que ha informado aquí. Hay algunas aplicaciones de prueba de verificación de instalación (algunos de esos diagnósticos instalados con los medios completos que mencioné) which are described here y que pueden ayudar a determinar si hay un problema con la instalación o con el código.

+0

El escenario es que estoy usando un programa Java para acceder a una cola de MQ implementada en una máquina separada a través de JMS, así que obtuve todas las librerías de MQ del servidor, la rareza reside en el hecho de que el mismo programa funciona perfectamente en el servidor donde MQ se implementa con los mismos jar en classpath, puede que tenga algo que ver con java.library.path prop, más ideas. :) – hakish

+0

El mensaje de error dice claramente que java.library.path falta mqjbnd. Si va al servidor en el que funciona, estoy seguro de que encontrará que java.library.path está configurado correctamente. Haz tuyo lo mismo y funcionará, estoy seguro. – duffymo

+0

Esta es la razón por la que IBM no admite este tipo de instalación. Si usa MQC7 SupportPac para instalar el cliente, obtendrá * todas * las librerías y los jar necesarios, así como las utilidades de diagnóstico.Según su comentario, el único lugar donde se utilizó el medio de instalación funciona. ¿Por qué no utilizar el procedimiento documentado y compatible para instalar las bibliotecas de cliente? Luego, podría abrir los PMR si fuera necesario y aplicar el mantenimiento. ¿O estas cosas no son importantes para su aplicación? –

1

El parámetro VM -Djava.library.path=/opt/mqm/java/lib64 funciona para mí. Mi entorno es Suse de 64 bits con MQ instalado y mi programa utiliza el tipo de transporte 'Enlaces'

6

Probablemente un poco tarde pero tuve el mismo problema y encontré que esto puede evitarse si usa un Modo de conexión diferente cuando se conecta a un cola remota Por defecto, el MQConnectionFactory usa WMQ_CM_BINDINGS ya que es el modo de conexión. Si lo cambia a WMQ_CM_CLIENT (o cualquiera que sea el modo de conexión que desee que no requiera bibliotecas nativas), estará bien.

@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

Como alguien que también tiene problemas con este problema, me gustaría aclarar que el cambio a WMQ_CM_CLIENT es necesario pero no suficiente. También necesitaba incluir "com.ibm.mq.jmqi.jar" en mi conjunto de jarras de biblioteca. Solo por información, esto a su vez extrae jms.jar, com.ibm.mq.headers.jar y com.ibm.mq.jar. Todavía estoy viendo (otros) problemas, por lo que se pueden necesitar más frascos. –

2

De acuerdo con Johnam, sucedió porque el ConnectionFactory establece como servidor por defecto, es necesario establecer como cliente, usted ha dicho que funciona en la misma máquina. Como también encontré la misma situación, se ejecuta en la misma máquina, en este caso porque su máquina es como servidor WMQ, así que haga el programa, pero cuando se ejecuta en una máquina diferente, entonces su programa debe establecerse como cliente.

me resuelvo con fijó algunos parámetros en 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

El problema es con variable Path en las propiedades del sistema. Trate de ejecutar código especificando MQInstallation Dir: ruta \ lib64 antes MQInstallation Dir: \ Lib

0

Añadir el siguiente a sus argumentos Tomcat:

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

Si el directorio de instalación es diferente a la anterior, utilice el adecuado ubicación.