MQ EBCDIC数据转换(25)的问题被解释为换行并转换为15

时间:2015-09-15 20:53:35

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

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

我们在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传递消息的问题?

3 个答案:

答案 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客户端正确地接收到此信息。