2012-08-24 100 views
2

我對ibm mq很陌生,發現與mb相關的文檔或書籍非常少,我找到的唯一一本是2004年編寫的「WebSphere MQ Using Java」但現實世界已經發生了很大變化。 我安裝並根據this使用java連接到ibm mq 7.5的問題

我還創建隊列管理myqm1,隊列LQ.TEST,信道JAVA.CHANNEL上成功RedHat Linux上的64位驗證MQ服務器7.5和確實通過上服務器命令行一些測試,以確保它們工作得很好。然而,當我安裝了Windows XP的一個MQ客戶端及以下java代碼寫的,它總是拋出一個exception:com.ibm.mq.MQException: MQJE001: Completion Code '2', Reason '2035'

我的代碼:

進口com.ibm.mq. *; import com.ibm.mq.constants.MQConstants;

/** *簡單的示例程序*/public類MQSample {

// code identifier 
static final String sccsid = "@(#) MQMBID sn=p000-L120604 su=_H-IvIK4nEeGko6IWl3MDhA pn=MQJavaSamples/wmqjava/MQSample.java"; 

// define the name of the QueueManager 
private static final String qManager = "myqm1"; 
// and define the name of the Queue 
private static final String qName = "LQ.TEST"; 

/** 
* Main entry point 
* 
* @param args - command line arguments (ignored) 
*/ 
public static void main(String args[]) { 
    try { 
     MQEnvironment.hostname = "58.2.221.196"; 
     MQEnvironment.channel = "JAVA.CHANNEL"; 
     MQEnvironment.port = 1414; 
     MQEnvironment.properties.put(MQC.TRANSPORT_PROPERTY, MQC.TRANSPORT_MQSERIES); 
     MQEnvironment.userID = "mqm"; 
     MQEnvironment.password = "mqm"; 
     MQEnvironment.CCSID = 1208; 

     // Create a connection to the QueueManager 
     System.out.println("Connecting to queue manager: " + qManager); 
     MQQueueManager qMgr = new MQQueueManager(qManager); 

     // Set up the options on the queue we wish to open 
     int openOptions = MQConstants.MQOO_INPUT_AS_Q_DEF | MQConstants.MQOO_OUTPUT; 

     // Now specify the queue that we wish to open and the open options 
     System.out.println("Accessing queue: " + qName); 
     MQQueue queue = qMgr.accessQueue(qName, openOptions); 

     // Define a simple WebSphere MQ Message ... 
     MQMessage msg = new MQMessage(); 
     // ... and write some text in UTF8 format 
     msg.writeUTF("Hello, World!"); 

     // Specify the default put message options 
     MQPutMessageOptions pmo = new MQPutMessageOptions(); 

     // Put the message to the queue 
     System.out.println("Sending a message..."); 
     queue.put(msg, pmo); 

     // Now get the message back again. First define a WebSphere MQ 
     // message 
     // to receive the data 
     MQMessage rcvMessage = new MQMessage(); 

     // Specify default get message options 
     MQGetMessageOptions gmo = new MQGetMessageOptions(); 

     // Get the message off the queue. 
     System.out.println("...and getting the message back again"); 
     queue.get(rcvMessage, gmo); 

     // And display the message text... 
     String msgText = rcvMessage.readUTF(); 
     System.out.println("The message is: " + msgText); 

     // Close the queue 
     System.out.println("Closing the queue"); 
     queue.close(); 

     // Disconnect from the QueueManager 
     System.out.println("Disconnecting from the Queue Manager"); 
     qMgr.disconnect(); 
     System.out.println("Done!"); 
    } catch (MQException ex) { 
     ex.printStackTrace(); 
     System.out.println("A WebSphere MQ Error occured : Completion Code " + ex.completionCode 
       + " Reason Code " + ex.reasonCode); 


    } catch (java.io.IOException ex) { 
     System.out.println("An IOException occured whilst writing to the message buffer: " + ex); 
    } 
    return; 
} } 

可有人扔一盞燈,我這句話?我完全失望了。

+0

可能相關:http://stackoverflow.com/questions/5101840/error-2035-mqrc-not-authorized-while-connecting-to-mq – beny23

+0

看起來像你的用戶名和密碼可能是錯誤的,因爲2035是'NOT已授權' – beny23

+1

您是否甚至向Google詢問'com.ibm.mq.MQException:MQJE001:完成代碼'2',原因'2035'? – home

回答

4

更多的細節,擴大沙市的答案,因爲WMQ V7.1默認CHLAUTH規則阻止所有SVRCONN通道他們阻止所有SVRCONN通道管理權限的所有訪問。如果您真的想連接到JAVA.CHANNEL作爲mqm那麼您將需要覆蓋這兩個這些行爲。

如果您確實願意允許使用管理用戶標識對QMgr進行遠程未經身份驗證的連接,則可以選擇完全禁用CHLAUTH規則。您可以通過在runmqsc中發佈ALTER QMGR CHLAUTH(DISABLED)命令來實現此目的,但是這是非常令人沮喪的,因爲它使QMgr對使用WMQ管理用戶標識的匿名遠程代碼執行開放。然而,這似乎是你想要做的。

推薦的方法是使用而不是管理的ID。例如,如果您創建了一個名爲mquser的ID與一個也稱爲mquser的私人組,那麼您可以授予它在QMgr上進行連接和查詢以及打開指定隊列以進行放置,獲取,瀏覽和查詢的權限。由於該ID不是管理性的,因此在未經認證的頻道上使用將是相對安全的。您可以更改您的代碼以指定ID爲mquser而不是mqm,然後使用CHLAUTH規則來允許連接。例如:

SET CHLAUTH('JAVA.CHANNEL') TYPE(USERMAP) + 
    CLNTUSER('mquser') USERSRC(MAP) + 
    MCAUSER('mquser') ACTION(ADD) 

上面的規則告訴QMGR「當你看到從JAVA.CHANNELmquser ID的連接,然後設置MCAUSER到mquser和允許的連接。」

當您授予權限時,請記住授予他們在組而不是用戶。例如,如果使用setmqaut,則使用-g選項,而不是-p選項。如果授權錯誤有任何問題,您可以使用事件消息輕鬆地將其排除。首先,使用ALTER QMGR AUTHOREV(ENABLED)啓用事件。這將導致QMgr發出一個事件消息到SYSTEM.ADMIN.QMGR.EVENT隊列中。您可以使用SupportPac MH05SupportPac MS0P解析事件消息。對於任何給定的授權事件,該消息會告訴您請求訪問的ID,API調用(連接,打開,關閉等),調用的對象以及使用的確切選項。

在WMQ V7.1之前,WebSphere MQ允許所有遠程連接,即使是匿名的管理連接。雖然這可以讓您輕鬆連接,但在當今更加惡意的網絡環境中,遠程和匿名執行QMgr主機服務器上的代碼的能力被視爲不可接受的安全風險。所以現在一個新的QMgr默認設置爲不允許任何遠程管理訪問。作爲管理員,這要求您明確禁用安全性以獲取舊行爲或明確配置安全訪問。

+0

感謝T.Rob,你的方法對於用戶mqm是有效的,對於新創建的用戶mquser和它的私有組,這是我嘗試的結果。不管我如何爲mquser設置身份驗證記錄,它只是拋出相同的錯誤正如我的主題所說。是否有一些特權需要授予mquser用戶/組訪問mq文件和服務? – user1458290

+0

我在回覆中添加了一些額外的診斷建議。 mquser ID和組不需要訪問WMQ文件。當使用通道訪問QMgr時,訪問QMgr *的所有進程都是* WMQ進程。當程序使用共享內存連接訪問QMgr時,目錄權限使用setuid來允許程序在需要時寫入錯誤。你收到的任何2035都是因爲該組未被授予它所需的權限,或者訪問的對象不是你認爲的對象。例如,如果使用IBM Java類,應用程序將總是*查詢任何對象。 –

3

在MQ v7.5中,默認情況下,阻止訪問隊列管理器。您需要爲您創建的頻道創建頻道驗證記錄,JAVA.CHANNEL以允許用戶訪問隊列管理器。請按照此link對信道認證記錄

+0

你好Shashi,我讀過文檔,測試結果與T.Rob的回答有關,請看看這個。 – user1458290