Websphere MQ & .NET - WriteString() 属性 使消息太长
Websphere MQ & .NET - WriteString() property makes message too long
所以我试图将消息发送到接受最大 482 字符串的队列。我发送的字符串长度为 452。这是访问请求队列的代码块:
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?
IBM MQ 类 for .NET 默认使用 CCSID 1200 (UTF-16),这是一个双字节字符集 (DBCS)。因为每个字符都表示为两个字节,所以您的 452 字符串表示为 904 个字节。
如果从队列中获取消息的应用程序需要 452 个字符并且正在使用“获取并转换”选项,则应用程序将正确读取消息。如果读取应用程序使用 ASCII 字符集,则应用程序会将其转换为 452 字节并读取。如果获取应用程序正在读取 CCSID 1200 或另一个 DBCS,这也会起作用,因为应用程序需要 452 个字符,即使在 DBCS 中它仍然会获取 452 个字符。如果这是您获取应用程序的工作方式,那么一种选择是增加队列的 MAXMSGL 以容纳在 DBCS 中编码的消息。
另一种选择是告诉您的放置应用程序将消息放入 ASCII 字符集中,例如 CCSID 437。
要将 CCSID 设置为 437,请使用以下命令:
messageObject.CharacterSet = 437;
所以我试图将消息发送到接受最大 482 字符串的队列。我发送的字符串长度为 452。这是访问请求队列的代码块:
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?
IBM MQ 类 for .NET 默认使用 CCSID 1200 (UTF-16),这是一个双字节字符集 (DBCS)。因为每个字符都表示为两个字节,所以您的 452 字符串表示为 904 个字节。
如果从队列中获取消息的应用程序需要 452 个字符并且正在使用“获取并转换”选项,则应用程序将正确读取消息。如果读取应用程序使用 ASCII 字符集,则应用程序会将其转换为 452 字节并读取。如果获取应用程序正在读取 CCSID 1200 或另一个 DBCS,这也会起作用,因为应用程序需要 452 个字符,即使在 DBCS 中它仍然会获取 452 个字符。如果这是您获取应用程序的工作方式,那么一种选择是增加队列的 MAXMSGL 以容纳在 DBCS 中编码的消息。
另一种选择是告诉您的放置应用程序将消息放入 ASCII 字符集中,例如 CCSID 437。
要将 CCSID 设置为 437,请使用以下命令:
messageObject.CharacterSet = 437;