MQ EBCDIC 数据转换问题 (25) 解释为换行并转换为 15
Issue with MQ EBCDIC data conversion (25) interpreted as line feed and converted to 15
我们遇到了一个有趣的问题。
我们集成了 AS400 系统,以 EBCDIC 格式发送 MQ 消息,由 TIBCO BW MQ 插件获取并处理。这些是金融交易。
我们遇到的问题是,当数据元素(压缩十进制)包含奇数位时,如 251
-259
或 25001
-25999
等,数据TIBCO BW MQ 插件将元素解释为 151
-159
等
因此我们将 25125
的金额解释为 15125
,导致交易记录丢失 100 美元(以美分计)。 TIBCO BW MQ 插件在下面使用 Java,因此这可能是一个 Java 问题。 AS400 能够发送和接收 25125
。但是当我们从 MQ 资源管理器浏览消息时,我们也看到数据元素值呈现为 15125
。
AS400 团队指出,由于他们能够作为 25125
发送和接收,所以问题不在他们这边。以前有人遇到过类似的问题吗?如果是这样,你是如何解决的?这是 MQ 客户端的问题还是 AS400 MQ 传递消息的问题?
我对TIBCO不熟悉...
但一般来说,通过 MQ 传递打包数据是一个坏主意。
MQ是多平台的,发送消息只有两种方式。作为字符串和原始字节。当您将其作为字符串发送时,它将根据所涉及的平台处理从一种编码到另一种编码的转换。
如您所见,将压缩十进制视为字符串是行不通的。
TIBCO 可能具有处理原始消息的功能,在 TIBCO(或您的 Java 应用程序?)中的某处,您必须配置 EBCDIC 到 ASCII (Unicode) 的转换以及解压缩压缩的十进制字段。您还必须设置 MQ 以发送原始消息。
否则,您将需要 IBM i 端解压缩数据,然后再将其作为 MQ 字符串消息发送。
从 EBCDIC 计算机获取数字数据的一种方法是通过将数字转换为字符的视图。
例如
CREATE TABLE DSYLVESTER/ZDAN1 (X1 decimal(3,2) NOT NULL WITH
DEFAULT)
select * from dsylvester/zdan1
3.22
create view qtemp/z3 as (
SELECT cast( X1 as char(5)) as x1
FROM dsylvester/zdan1
)
select * from qtemp/z3
3.22
备注:
打电话给 IBM,他们不知道该怎么做。
打电话给 TIBCO,他们在广告和销售上的花费比在开发上的花费还多。 TIBCO 无法提供帮助。
感谢大家指点。
事实证明这是与 MQ 客户端一起提供的 java jar 的问题。事实证明,这个特定的字节“0x25”具有奇怪的 属性,当
由 JVM 以这种方式处理并被视为编码为
CCSID 37 方案,输出字节为“0x15”。
例如,使用以下形式的代码片段:
byte[] bytesRepresentation = {(byte)0x25};
String dataAsString = new String(bytesRepresentation, "IBM-037");
byte[] newBytesRepresentation =
dataAsString.getBytes(Charset.forName("IBM-037"));
System.out.println(byteArrayToHexString(bytesRepresentation));
System.out.println(byteArrayToHexString(newBytesRepresentation));
输出为:
25
15
即。字节序列已被 byte[]->String->byte[] 改变
处理中。
MQ 支持已建议发送方将消息 属性 将消息格式标识为 MQSTR 更改为默认值(空白)。执行此操作后,MQ 客户端不会尝试转换,TIBCO 会从 MQ 客户端正确接收此转换。
我们遇到了一个有趣的问题。
我们集成了 AS400 系统,以 EBCDIC 格式发送 MQ 消息,由 TIBCO BW MQ 插件获取并处理。这些是金融交易。
我们遇到的问题是,当数据元素(压缩十进制)包含奇数位时,如 251
-259
或 25001
-25999
等,数据TIBCO BW MQ 插件将元素解释为 151
-159
等
因此我们将 25125
的金额解释为 15125
,导致交易记录丢失 100 美元(以美分计)。 TIBCO BW MQ 插件在下面使用 Java,因此这可能是一个 Java 问题。 AS400 能够发送和接收 25125
。但是当我们从 MQ 资源管理器浏览消息时,我们也看到数据元素值呈现为 15125
。
AS400 团队指出,由于他们能够作为 25125
发送和接收,所以问题不在他们这边。以前有人遇到过类似的问题吗?如果是这样,你是如何解决的?这是 MQ 客户端的问题还是 AS400 MQ 传递消息的问题?
我对TIBCO不熟悉...
但一般来说,通过 MQ 传递打包数据是一个坏主意。
MQ是多平台的,发送消息只有两种方式。作为字符串和原始字节。当您将其作为字符串发送时,它将根据所涉及的平台处理从一种编码到另一种编码的转换。
如您所见,将压缩十进制视为字符串是行不通的。
TIBCO 可能具有处理原始消息的功能,在 TIBCO(或您的 Java 应用程序?)中的某处,您必须配置 EBCDIC 到 ASCII (Unicode) 的转换以及解压缩压缩的十进制字段。您还必须设置 MQ 以发送原始消息。
否则,您将需要 IBM i 端解压缩数据,然后再将其作为 MQ 字符串消息发送。
从 EBCDIC 计算机获取数字数据的一种方法是通过将数字转换为字符的视图。
例如
CREATE TABLE DSYLVESTER/ZDAN1 (X1 decimal(3,2) NOT NULL WITH
DEFAULT)
select * from dsylvester/zdan1
3.22
create view qtemp/z3 as (
SELECT cast( X1 as char(5)) as x1
FROM dsylvester/zdan1
)
select * from qtemp/z3
3.22
备注: 打电话给 IBM,他们不知道该怎么做。 打电话给 TIBCO,他们在广告和销售上的花费比在开发上的花费还多。 TIBCO 无法提供帮助。
感谢大家指点。
事实证明这是与 MQ 客户端一起提供的 java jar 的问题。事实证明,这个特定的字节“0x25”具有奇怪的 属性,当 由 JVM 以这种方式处理并被视为编码为 CCSID 37 方案,输出字节为“0x15”。
例如,使用以下形式的代码片段:
byte[] bytesRepresentation = {(byte)0x25};
String dataAsString = new String(bytesRepresentation, "IBM-037");
byte[] newBytesRepresentation =
dataAsString.getBytes(Charset.forName("IBM-037"));
System.out.println(byteArrayToHexString(bytesRepresentation));
System.out.println(byteArrayToHexString(newBytesRepresentation));
输出为:
25 15
即。字节序列已被 byte[]->String->byte[] 改变 处理中。
MQ 支持已建议发送方将消息 属性 将消息格式标识为 MQSTR 更改为默认值(空白)。执行此操作后,MQ 客户端不会尝试转换,TIBCO 会从 MQ 客户端正确接收此转换。