2017-08-09 34 views
2

所以我想發送一個消息到一個接受最大482字符串的隊列。我發送它的字符串的長度爲452.這裏是該請求隊列被訪問的代碼塊:Websphere MQ&.NET - WriteString()屬性使消息太長

  var openOptions = MQC.MQOO_OUTPUT + MQC.MQOO_FAIL_IF_QUIESCING; 
      requestQueue = queueManager.AccessQueue(requestQueueName, openOptions); 
      var messageObject = new MQMessage(); 
      messageObject.WriteString(message); 
      openReplyQueue(replyQueueName); 
      messageObject.ReplyToQueueName = replyQueue.Name; 
      messageObject.Format = MQC.MQFMT_STRING 
      messageObject.MessageType = MQC.MQMT_REQUEST; 
      messageObject.Report = MQC.MQRO_COPY_MSG_ID_TO_CORREL_ID; 
      messageObject.Expiry = 300; 
      var pmo = new MQPutMessageOptions(); 
      pmo.Options = MQC.MQPMO_FAIL_IF_QUIESCING; 
      requestQueue.Put(messageObject, pmo); 

與所述的MQException原因代碼2030對於某些控制檯輸出的最後一行中的代碼失敗,我發現,在MQMessage對象的消息長度是904 ,正好是我嘗試發送的字符串長度的兩倍,並且比隊列的最大消息長度長。

如何保持此緩衝區不發生並確保消息長度保持在452?

回答

1

用於.NET的IBM MQ類默認使用CCSID 1200(UTF-16),它是雙字節字符集(DBCS)。因爲每個字符都表示爲兩個字節,所以452字符的字符串表示爲904個字節。

如果從隊列中獲取消息的應用程序需要452個字符並正在使用Get with Convert選項,則該消息將被應用程序正確讀取。如果閱讀應用程序正在使用ASCII字符集,則該應用程序會將其轉換並讀取爲452個字節。如果獲取的應用程序正在讀取CCSID 1200或另一個DBCS,這也可以工作,因爲應用程序需要452個字符,即使在DBCS中它仍然可以獲得452個字符。如果這是您獲取應用程序的工作方式,那麼一種選擇是增加隊列的MAXMSGL以適應在DBCS中編碼的消息。

另一種選擇是要告訴你的放入應用把消息中的ASCII字符集,如CCSID 437

要設置CCSID 437使用以下命令:

messageObject.CharacterSet = 437; 
+0

@ jollyroger23這篇信息有助於解決您的問題? – JoshMc

+0

我這麼認爲@JoshMc。感謝您的幫助! – jollyroger23

+0

@ jollyroger23沒問題,很樂意幫忙。如果有幫助,請回顧一下「當某人回答我的問題時,我應該怎麼做?」(https://stackoverflow.com/help/someone-answers)「。如果您發現它有幫助,請特別接受並投票。謝謝。 – JoshMc