【问题标题】:Issue with MQ EBCDIC data conversion (25) interpreted as line feed and converted to 15MQ EBCDIC 数据转换问题 (25) 解释为换行并转换为 15
【发布时间】:2015-10-03 02:45:05
【问题描述】:

我们遇到了一个有趣的问题。

我们在 AS400 系统之间集成,以 EBCDIC 格式发送 MQ 消息,由 TIBCO BW MQ 插件接收并处理。这些是金融交易。

我们遇到的问题是,当数据元素(压缩十进制)包含奇数位(如 251-25925001-25999 等)时,TIBCO BW MQ 插件会将数据元素解释为151-159

因此,我们将 25125 的金额解释为 15125,导致交易记录缺失 100 美元(金额以美分为单位)。 TIBCO BW MQ 插件在下面使用 Java,所以这可能是 Java 问题。 AS400 能够以25125 发送和接收。但是当我们从 MQ 资源管理器中浏览消息时,我们看到数据元素值也呈现为 15125

AS400 团队指定,由于他们能够以25125 发送和接收,因此问题不在他们这边。有没有人遇到过类似的问题?如果是这样,您是如何解决的?这是 MQ 客户端的问题还是 AS400 MQ 传递消息的问题?

【问题讨论】:

  • PackedDecimal 数字应该包含奇数位数,因为符号(最后一个半字节)占用 1 位数的空间(最后一个半字节)。如果 MQ 资源管理器对数字的解释不正确,那么这不太可能是客户端的问题。最高位总是递减 1 还是右移?试试501和401,它们都变成201了吗?还是 401 和 301?
  • 只有25系列才会出现这种情况,其他都很好。显然 25 是换行符表示,在解析数据时被替换为 15
  • 我们在工程构建上与 TIBCO 支持反复讨论,结果证明是 MQ 客户端存在问题。如果 MQ 客户端有支持或者它是开源的,有没有人有任何见解。

标签: java ibm-mq ibm-midrange mq tibco


【解决方案1】:

我不熟悉 TIBCO...

但一般来说,通过 MQ 传递打包数据是个坏主意。

MQ 是多平台的,只有两种发送消息的方式。作为字符串和原始字节。当您将其作为字符串发送时,它将根据所涉及的平台处理从一种编码转换为另一种编码。

如您所见,将压缩十进制视为字符串是行不通的。

TIBCO 可能具有处理原始消息的功能,在 TIBCO(或您的 Java 应用程序?)的某个地方,您必须配置 EBCDIC 到 ASCII (Unicode) 的转换以及解压缩压缩的十进制字段。您还必须设置 MQ 以原始发送该消息。

否则,您需要 IBM i 端在将数据作为 MQ 字符串消息发送之前对其进行解包。

【讨论】:

  • 数据以字节而不是字符串的形式发送和接收。解析字节时,以 25 开头的字节被替换为 15。
  • 如果 MQ 正在发送原始字节,则客户端正在获取原始字节,因此问题出在 TIBCO 或您的 Java 应用程序上;无论哪个在进行解析。
【解决方案2】:

从 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 将无法提供帮助。

【讨论】:

  • 感谢 Danny,但 MQ 核心系统不想为此做任何更改。所以我们最终调试并找出问题所在。我会尽快发布答案
【解决方案3】:

感谢大家不同的指点。

这原来是与 MQ 客户端一起提供的 java jar 的问题。事实证明,这个特殊的字节“0x25”有一个奇怪的属性,当 JVM以这种方式处理并被视为编码的字符 CCSID 37 方案,输出字节为 '0x15'。

例如,使用如下形式的代码 sn-p:

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 客户端正确接收到此。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-01-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-07-29
    • 1970-01-01
    相关资源
    最近更新 更多