我们遇到了一个有趣的问题。
我们在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帮不了你。
谢谢大家的指点。
这是与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));
输出为:
2515
ie。字节序列被byte[]->String->byte[]改变处理。
MQ Support建议发送端更改将消息格式标识为MQSTR的消息属性,将其更改为default(空白)。在此之后,MQ客户机不会尝试转换,TIBCO从MQ客户机正确地接收到此转换。