【问题标题】:Remove carriage return from an incoming message in IBM MQ从 IBM MQ 中的传入消息中删除回车
【发布时间】:2018-03-28 19:06:52
【问题描述】:

要求是从 IBM MQ 中的传入消息中删除回车。

我们的应用程序期望响应消息中的字符长度为 1579,但它以 1581 结尾并带有“CRLF”

当执行以下命令时
/opt/mqm/samp/bin/amqsbcg TXN_RCV_FRM_SYS TXNSYS850.QM
长度 - 1581 个字节,共 1581 个

当通过 /opt/mqm/samp/bin/amqsput TXN_RCV_FRM_SYS TXNSYS850.QM 删除“CRLF”放置相同的响应消息时,应用程序能够从 QM 中选择消息

请指导我进行任何配置设置以从队列或 QM 级别中删除这些字符

2018 年 3 月 28 日问题已解决 :-)

MQGMO_CONVERT
将上述值设置为 true...
此选项将消息中的应用程序数据转换为符合 MQGET 调用的 MsgDesc 参数中指定的 CodedCharSetId 和 Encoding 值。数据在复制到 Buffer 参数之前进行转换。 转换过程假定放置消息时指定的格式字段来识别消息中数据的性质。消息数据由队列管理器转换为内置格式,并由用户编写的出口转换为其他格式。有关数据转换出口的详细信息,请参阅数据转换。 如果转换成功,则在从 MQGET 调用返回时,MsgDesc 参数中指定的 CodedCharSetId 和 Encoding 字段将保持不变。 如果仅转换失败,则返回未转换的消息数据 MsgDesc 中的 CodedCharSetId 和 Encoding 字段设置为未转换消息的值。在这种情况下,完成代码是 MQCC_WARNING。 无论哪种情况,这些字段都描述了 Buffer 参数中返回的消息数据的字符集标识符和编码。 有关队列管理器执行转换的格式名称列表,请参阅 MQMD - 消息描述符中描述的格式字段。

在 amqsbcg 中工作和不工作的 CCSD 详细信息

不工作
编码:273 CodedCharSetId:1208
工作
编码:546 CodedCharSetId:1208

【问题讨论】:

  • 如果 CRLF 是问题所在,那么 MQGMO_CONVERT 肯定没有解决它。 convert 选项可以更改字符的编码方式,但不能更改字符本身。

标签: ibm-mq


【解决方案1】:

没有 QUEUE 或 QM 级别设置可以完成从消息末尾删除 CRLF。

您有以下选择:

  1. 修改发送应用程序,使其不发送最后两个字符为 CRLF 的消息。
  2. 修改接收应用程序,使其忽略 CRLF。
  3. 如果您无法更改发送或接收应用程序,那么唯一的另一个选择是在中间放置一些可以为您工作的东西,一个简单的程序,从一个队列中读取消息,剥离 CRLF 并写入第二个队列。

编码相关更新

IBM 技术说明“Data Conversion under WebSphere MQ”附带的 PDF 详细介绍了编码和 CCSID 如何影响转换。

编码

编码一般是指本平台使用的方法 来表示数字数据。一般有两种:

  • “LittleEndian”,由 Intel 处理器(例如 Windows、Linux on Intel)使用。在这种编码中,最低有效数字出现在较低的位置 内存位置,例如数字 437 将表示(以十六进制表示)为 X'BF01'。
  • “大端”。最高有效数字位于较低的内存位置。例如数字 437 将表示(以十六进制表示)为 X'01BF'。

关于您的工作和非工作消息:

编码 273 对应于 Unix(非 Intel)操作系统,例如 AIX 或 Solaris Spark,这被称为 Big Endian。

Encoding 546 对应 Intel 上的 Linux 和 Windows 操作系统,称为 Little Endian。

在这两种情况下,您都有 CCSID 1208,它对应于 UTF-8,它是一个可变字节字符集,每个字符可以有 1 到 4 个字节。


我不确定为什么编码会影响您处理邮件正文的能力。您能否提供发送和接收应用程序的 MQ 队列管理器版本的详细信息以及发送和接收应用程序的 IBM MQ jar 文件版本?

【讨论】:

  • @MQBeginner 你确定 CRLF 是问题吗?如果消息中存在这些字符,Convert 不会删除这些字符。如果 MQGMO_CONVERT 解决了您的问题,那么问题的根源可能不是 CRLF。如果您想了解原因是什么,您应该提供编码在 MQMD 中的 CCSID 和读取应用程序的 CCSID,或者如果您不知道读取应用程序的 CCSID,请提供编写应用程序的语言.
  • 对不起,我不了解 CCSID,发送和接收应用程序是用 JAVA 编写的。我想知道这是如何解决的?当我删除 CRLF 字段并将消息放入 Q 时,应用程序已处理。
  • 你可以在 amqsbcg 输出中看到 CCSID,它叫它CodedCharSetId,输出可能看起来像这样Encoding : 546 CodedCharSetId : 1208
猜你喜欢
  • 2018-12-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-08-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多