我们遇到了一个有趣的问题。
我们在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传递消息的问题?
答案 0 :(得分:1)
我不熟悉TIBCO ......
但一般来说,通过MQ传递打包数据是一个坏主意。
MQ是多平台的,只有两种方式来发送消息。作为字符串和原始字节。当您将其作为字符串发送时,它将处理从一种编码转换为另一种编码,这取决于所涉及的平台。
如您所见,将压缩十进制视为字符串不起作用。
TIBCO可能具有处理原始消息的功能,在TIBCO(或您的Java应用程序?)的某处,您必须配置EBCDIC到ASCII(Unicode)转换以及解压缩压缩十进制字段。您还必须将MQ设置为原始发送该消息。
否则,您需要IBM i端在将数据作为MQ字符串消息发送之前解压缩数据。
答案 1 :(得分:1)
从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将无法提供帮助。
答案 2 :(得分:0)
感谢所有不同的指针。
结果证明这是与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
即。字节序列已被字节[] - >字符串 - >字节[]更改 处理
MQ支持人员建议发送方将标识消息格式的消息属性更改为MQSTR,以将其更改为默认值(空白)。执行此操作后,MQ客户端不会尝试转换,并且TIBCO已从MQ客户端正确地接收到此信息。