2017-08-09 98 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