2017-07-18 335 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