2013-02-25 153 views
2

這是我正在使用的示例代碼,但是,我不知道如何從put或access隊列獲取響應,以便發送消息。如何從IBM MQ的put方法獲取確認?

mqQueue = mqQMgr.AccessQueue("Queue Name", MQC.MQOO_OUTPUT | 
MQC.MQOO_INPUT_SHARED |  MQC.MQOO_INQUIRE); 
mqQueue.Put(mqMsg, mqPutMsgOpts); 

PUT方法是返回void類型,如果它會一直布爾例如,根據返回值 - 真/假,我可以證實,消息被髮送到隊列中,這是我的問題,我如何取回確認信息,以便將消息發送到隊列中。

任何輸入將非常有幫助。

回答

3

更新按照發表意見,澄清了一個問題:

括在一個try塊你PUT,趕上MQException。如果沒有MQException被引發,那麼PUT工作,你回到RC = 0。例如,這是從樣品PUT程序:

void PutMessages() 
    { 
     try 
     { 
      // mq properties 
      properties = new Hashtable(); 
      properties.Add(MQC.TRANSPORT_PROPERTY, MQC.TRANSPORT_MQSERIES_MANAGED); 
      properties.Add(MQC.HOST_NAME_PROPERTY, hostName); 
      properties.Add(MQC.PORT_PROPERTY, port); 
      properties.Add(MQC.CHANNEL_PROPERTY, channelName); 

      // display all details 
      Console.WriteLine("MQ Parameters"); 
      Console.WriteLine("1) queueName = " + queueName); 
      Console.WriteLine("2) host = " + hostName); 
      Console.WriteLine("3) port = " + port); 
      Console.WriteLine("4) channel = " + channelName); 
      Console.WriteLine("5) numberOfMsgs = " + numberOfMsgs); 
      Console.WriteLine(""); 

      // create connection 
      Console.Write("Connecting to queue manager.. "); 
      queueManager = new MQQueueManager(queueManagerName, properties); 
      Console.WriteLine("done"); 

      // accessing queue 
      Console.Write("Accessing queue " + queueName + ".. "); 
      queue = queueManager.AccessQueue(queueName, MQC.MQOO_OUTPUT + MQC.MQOO_FAIL_IF_QUIESCING); 
      Console.WriteLine("done"); 

      // creating a message object 
      message = new MQMessage(); 
      message.WriteString(messageString); 

      // putting messages continuously 
      for (int i = 1; i <= numberOfMsgs; i++) 
      { 
       Console.Write("Message " + i + " <" + messageString + ">.. "); 
       queue.Put(message); 
       Console.WriteLine("put"); 
      } 

      // closing queue 
      Console.Write("Closing queue.. "); 
      queue.Close(); 
      Console.WriteLine("done"); 

      // disconnecting queue manager 
      Console.Write("Disconnecting queue manager.. "); 
      queueManager.Disconnect(); 
      Console.WriteLine("done"); 
     } 

     catch (MQException mqe) 
     { 
      Console.WriteLine(""); 
      Console.WriteLine("MQException caught: {0} - {1}", mqe.ReasonCode, mqe.Message); 
      Console.WriteLine(mqe.StackTrace); 
     } 
    } 

如上所述,這是從示例代碼和用於生產可能會具有更精細的異常處理一個真正的程序。也就是說,API調用將成功或拋出MQException。確切的行爲取決於你的選擇。例如,如果您請求GET上的消息轉換,則可能會收到轉換錯誤,而作爲二進制有效內容檢索到的完全相同的消息會成功。


上回應:

我不知道我理解的問題,但我認爲你問的是如何設計的請求/使用WebSphere MQ答辯程序,這就是我怎麼樣我會迴應。但是,如果通過「回覆」,您確實指出了PUT的原因並返回代碼,請澄清問題,我會更新我的回答。

請求/響應的通常模式是請求程序首先打開回復隊列。如果打開的隊列的名稱是模型隊列,則隊列管理器將創建一個動態隊列並返回該句柄。否則,隊列必須是預先存在的本地隊列。

一旦應用程序在回覆隊列中有一個句柄,它就會打開請求隊列並創建一個新的請求消息。本地回覆隊列的名稱用於初始化請求消息的replyToQueue字段。本地隊列管理器名稱將自動填入消息的replyToQMgr字段。然後,應用程序將該消息放入回覆隊列中並等待回覆。

如果有多個應用程序實例在相同的回覆隊列中偵聽,他們通常爲他們想要的特定消息指定相關ID。通常的設計是,讀取請求消息的服務器將MQMD.MsgID放入回覆消息的MQMD.CorrelID字段中,但有時會將傳入的消息ID傳輸到出站消息ID。

一定要COMMITPUT發出GET之前,否則你將永遠不會得到答覆。

關於此,Infocenter主題Design of the Request sample program中有更多內容,您可以在默認的Windows WMQ客戶端安裝中找到示例程序C:\Program Files (x86)\IBM\WebSphere MQ\tools\dotnet。我鼓勵你熟悉這些示例,並重新使用一些代碼。如果您沒有真正下載並安裝完整的客戶端,請撥打免費的SupportPac MQC75。然後,當您安裝它時,一定要選擇安裝SDK和示例代碼的選項。

+0

感謝。 PUT方法是返回void類型,如果它會一直布爾例如,根據返回值 - 真/假,我可以證實,消息被髮送到隊列中,這是我的問題,我怎麼回去的確認,以便消息被髮送到隊列。 – Sharpeye500 2013-02-26 00:03:43

1

我怎麼回確認,因此該消息被髮送到 隊列

如果把方法不拋出一個異常,然後是你的承認MQ已經把消息發送到隊列。