2017-07-18 333 views
2

我们有一个应用程序完全可以在分期中使用,但是当我们将其部署到生产时,我们正在获取MQ错误2495.我们正在Tomcat 8.5中运行应用程序,并且我们正在使用相同的MQ库(8.0.0.6)。服务器操作系统是Windows。连接到MQ管理器获取MQ错误2495

从MQ读取消息的代码如下所示:

MQEnvironment.hostname = queueSettings.getServer(); 
     MQEnvironment.channel = queueSettings.getChannel(); 
     MQEnvironment.port = queueSettings.getPort(); 

     MQQueueManager queueManager = new MQQueueManager(queueSettings.getQueueManager()); 

     int openOptions = CMQC.MQCBDO_FAIL_IF_QUIESCING | CMQC.MQOO_INPUT_SHARED | CMQC.MQOO_BROWSE; 

     MQQueue queue = queueManager.accessQueue(queueSettings.getQueue(), openOptions); 

德错误的完整堆栈跟踪的样子:

com.ibm.mq.MQException: MQJE001: Completion Code '2', Reason '2495'. 
at com.ibm.mq.MQSESSION.(MQSESSION.java:2063) 
at com.ibm.mq.MQSESSION.getSession(MQSESSION.java:2103) 
at com.ibm.mq.MQManagedConnectionJ11.(MQManagedConnectionJ11.java:207) 
at com.ibm.mq.MQBindingsManagedConnectionFactoryJ11._createManagedConnection(MQBindingsManagedConnectionFactoryJ11.java:185) 
at com.ibm.mq.MQBindingsManagedConnectionFactoryJ11.createManagedConnection(MQBindingsManagedConnectionFactoryJ11.java:230) 
at com.ibm.mq.StoredManagedConnection.(StoredManagedConnection.java:96) 
at com.ibm.mq.MQSimpleConnectionManager.allocateConnection(MQSimpleConnectionManager.java:194) 
at com.ibm.mq.MQQueueManagerFactory.obtainBaseMQQueueManager(MQQueueManagerFactory.java:758) 
at com.ibm.mq.MQQueueManagerFactory.procure(MQQueueManagerFactory.java:706) 
at com.ibm.mq.MQQueueManagerFactory.constructQueueManager(MQQueueManagerFactory.java:670) 
at com.ibm.mq.MQQueueManagerFactory.createQueueManager(MQQueueManagerFactory.java:145) 
at com.ibm.mq.MQQueueManager.(MQQueueManager.java:675) 
at com.atlascopco.cpq.connections.MQConnection.readMessagesFromQueue(MQConnection.java:92) 
at com.atlascopco.cpq.tasks.ResponseHandlerTask.run(ResponseHandlerTask.java:43) 
at java.util.TimerThread.mainLoop(Unknown Source) 
at java.util.TimerThread.run(Unknown Source) 
Caused by: com.ibm.mq.jmqi.JmqiException: CC=2;RC=2495;AMQ8568: The native JNI library 'mqjbnd64' was not found. For a client installation this is expected. [3=mqjbnd64] 
at com.ibm.mq.jmqi.local.LocalMQ.loadLib(LocalMQ.java:1202) 
at com.ibm.mq.jmqi.local.LocalMQ$1.run(LocalMQ.java:272) 
at java.security.AccessController.doPrivileged(Native Method) 
at com.ibm.mq.jmqi.local.LocalMQ.initialise_inner(LocalMQ.java:260) 
at com.ibm.mq.jmqi.local.LocalMQ.initialise(LocalMQ.java:223) 
at com.ibm.mq.jmqi.local.LocalMQ.(LocalMQ.java:1255) 
at com.ibm.mq.jmqi.local.LocalServer.(LocalServer.java:219) 
at sun.reflect.GeneratedConstructorAccessor10933.newInstance(Unknown Source) 
at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(Unknown Source) 
at java.lang.reflect.Constructor.newInstance(Unknown Source) 
at com.ibm.mq.jmqi.JmqiEnvironment.getInstance(JmqiEnvironment.java:656) 
at com.ibm.mq.jmqi.JmqiEnvironment.getMQI(JmqiEnvironment.java:590) 
at com.ibm.mq.MQSESSION.(MQSESSION.java:2056) 
... 15 common frames omitted 
Caused by: java.lang.UnsatisfiedLinkError: no mqjbnd64 in java.library.path 
at java.lang.ClassLoader.loadLibrary(Unknown Source) 
at java.lang.Runtime.loadLibrary0(Unknown Source) 
at java.lang.System.loadLibrary(Unknown Source) 
at com.ibm.mq.jmqi.local.LocalMQ.loadLib(LocalMQ.java:1146) 
... 27 common frames omitted 

我怎样才能找到问题?

+0

请仔细阅读[在什么情况下我想补充“紧急”或其他类似的短语我的问题,为了获得更快的答案?](// meta.stackoverflow。 com/q/326569) - 总结是这不是解决志愿者问题的理想方法,而且可能对获得答案起反作用。请不要将这添加到您的问题。 – halfer

+1

问题出在你的面前:'UnsatisfiedLinkError:java.library.path'中没有mqjbnd64。您的驱动程序需要一个本机库'mqjbnd64',这在生产环境中是缺少的。 – Holger

回答

4

的问题是在你的堆栈跟踪:

Caused by: com.ibm.mq.jmqi.JmqiException: CC=2;RC=2495;AMQ8568: The native JNI library 'mqjbnd64' was not found. For a client installation this is expected. [3=mqjbnd64] 
Caused by: java.lang.UnsatisfiedLinkError: no mqjbnd64 in java.library.path 

这是IBM的MQ知识中心网页上记载“Configuring the Java Native Interface (JNI) libraries

在Windows上,库的默认位置是下面:

MQ_INSTALLATION_PATH\java\lib (32-bit libraries) 
MQ_INSTALLATION_PATH\java\lib64 (64-bit libraries) 

您可以通过两种方式之一指定该库的位置(如果MQ安装在默认位置,以下两个示例都适用于64位JRE位置,如果你正在运行一个32位JRE使用lib目录而不是lib64目录):

  1. 随着JVM参数,例如:
    -Djava.library.path=C:\Program Files\IBM\MQ\java\lib64
  2. 通过OS环境变量。在你在Windows下使用:
    set PATH=C:\Program Files\IBM\MQ\java\lib64;%PATH%
+0

我们尝试过,但没有任何运气。在正确配置JNI库时会弹出相同的错误。 – JimmyD

+0

我们尝试了操作系统环境变量方法。 – JimmyD

+0

我手动将路径添加到Windows中的路径变量。所以这是正确的,cmd可以直接访问dll文件。 – JimmyD