2013-01-18 142 views
4

對於下面的代碼WMQ JNDI查找與認證

public class JMSSamplePut 
    { 
     private static String initialContextUrl = null; 
     private static String connectionFactoryFromJndi = "UM_QMGR_QCF"; 
     private static String queueFromJndi = "BCUFXW.EXB.ATHENA.FX.IN"; 
     private static String outString = "A sample text message " + 
            "from JMSSampleput"; 
     private static int retryInterval = 10; 
     private static int retryCount = 3; 
     private static int connStatus = 1; 


     /** 
     * @param args 
     */ 
     public static void main(String[] args) 
     { 

     // Variables 
     Queue     ioQueue  = null; 
     QueueSession   session  = null; 
     QueueSender    queueSender = null; 
     QueueConnection   connection = null; 
     QueueConnectionFactory factory  = null; 
     boolean     transacted = false; 
     int i = 0; 

     try { 
      // Instantiate the initial context for JNDI 
      String contextFactory ="com.sun.jndi.fscontext.RefFSContextFactory"; 
      Hashtable environment = new Hashtable(); 
      environment.put(Context.INITIAL_CONTEXT_FACTORY, contextFactory); 
      environment.put(Context.PROVIDER_URL, "file:/c:/jndi"); 
      Context context = new InitialDirContext(environment); 
      System.out.println("Initial context found!"); 

      // Create a Queue ConnectionFactory 
      factory = (QueueConnectionFactory) context.lookup(connectionFactoryFromJndi); 

    ........... 

最後一行與

陷入失敗的JMSException:com.ibm.msg.client.jms.DetailedJMSSecurityException:JMSWMQ2013:安全認證無法通過連接模式'客戶端'和主機名'NATMIB1.hostname.net(1414)'爲隊列管理器'提供。請檢查您正在連接的隊列管理器上提供的用戶名和密碼是否正確 鏈接的異常:com.ibm.mq.MQException:JMSCMQ0001:WebSphere MQ調用失敗,並顯示compcode'2'('MQCC_FAILED')原因'2035'( 'MQRC_NOT_AUTHORIZED')。 成品

JVM ARGS

-Djavax.net.ssl.keystore=c://keystore//a_dev.jks \ 
-Djavax.net.ssl.keyStorePassword=******** \ 
-Djavax.net.ssl.trustStorePassword=******** \ 
-Djavax.net.ssl.trustStore=c://keystore//cacerts.jks \ 
-Djavax.net.debug=all 

任何指針?爲什麼是以下行?

安全認證無效這是對的QueueManager「與連接模式「客戶」和主機名「NATMIB1.hostname.net(1414)」

貌似JNDI代理是無法找到所提供的」 QueueManager的名稱? 我在.bindings文件中的以下行和隊列管理器名稱預先NATMIB1

UM_QMGR_QCF/RefAddr/3/Content=NATMIB1.xyz.net 

感謝

孫大信

回答

2

在這個例子中,你正在使用的文件系統上下文的JNDI供應商。 JMS對象以c:/ jndi目錄中的平面文件格式存儲。正如你所做的一樣,你可以在文本編輯器中查看這個文件,它不是那麼容易閱讀,但你可以看到對象的一些元素。另外,我建議使用WMQ資源管理器作爲選擇的管理工具 - 可以讀取和更新任何包括文件系統上下文的JNDI。

最後一行是查找名爲「UM_QMGR_QCF」的對象。這只是對對象進行查找。它不會連接到QueueManager來執行此操作,並且連接工廠對象的創建將不會創建連接返回到QueueManager。

正在查看的錯誤將來自createConnection調用。該錯誤意味着createConnection調用上提供的用戶ID /密碼與QM上設置的任何安全性不匹配或未通過身份驗證。

該錯誤未與TCP/IP鏈接上的SSL設置相關聯。

有關設置WMQ安全信息,你可以用這個scenarion開始http://publib.boulder.ibm.com/infocenter/prodconn/v1r0m0/index.jsp?topic=%2Fcom.ibm.scenarios.wmqwas101.doc%2Ftopics%2Fscenario_overview.htm

我建議確認,其中異常從哪裏來 - 也儘量只在對象上做的System.out.println()的從JNDI返回。所有WMQ管理對象都將通過內置的toString格式化自己()

+0

WMQ不檢查密碼。 –

3

調試WMQ安全錯誤非常簡單如果您有合適的工具。首先,按照說明獲取SupportPac MS0P並安裝到WMQ資源管理器中。如果您沒有WMQ資源管理器的現代版本,則可以從SupportPac MS0T下載它。

接下來,在QMgr上啓用授權事件並重新創建錯誤。

此時,右鍵單擊WMQ資源管理器中的事件隊列,然後選擇格式化事件消息。這將向您顯示錯誤的所有方面,包括:

  1. 生成錯誤的用戶標識。根據頻道設置,退出和客戶端設置,使用的ID可能不是您所期望的。
  2. 已完成的API調用。可能在這種情況下連接,但有時這也不是你所期望的。例如,IBM JMS類將始終在QMgr上查詢以獲取DLQ名稱,如果您未授權查詢,則會失敗。
  3. 用於調用的確切選項。
  4. 呼叫發出的對象。

一旦你知道錯誤的這些元素,你可以確定其是否與ID本身有問題,通道,此ID的授權等


更新

響應於在評論一個問題,爲了使授權事件使用MQ Explorer或的runmqsc如下:

Command line version

對於MQ Explorer版本,首先右鍵單擊QMgr並選擇Properties。

enter image description here

然後選擇在導航面板中活動,根據需要設置,然後單擊OK的事件。

enter image description here

+0

如何啓用授權事件?謝謝。 – JackDev

+1

使用MQ資源管理器,右鍵單擊QMgr,然後選擇屬性 - >事件並將授權事件切換爲「啓用」,或者在runmqsc中執行'ALTER QMGR AUTHOREV(ENABLED)'。 –