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

Java MQ EBCDIC数据转换问题(25)解释为换行并转换为15,java,ibm-mq,ibm-midrange,mq,tibco,Java,Ibm Mq,Ibm Midrange,Mq,Tibco,我们遇到了一个有趣的问题 我们在AS400系统之间进行了集成,该系统以EBCDIC格式发送MQ消息,由TIBCO BW MQ插件拾取并处理。这些都是金融交易 我们面临的问题是,当数据元素(压缩十进制)包含奇数位数时,如251-259或25001-25999等。TIBCO BW MQ插件将数据元素解释为151-159等 因此,我们将25125的金额解释为15125,导致交易记录缺失100美元(金额单位为美分)。TIBCO BW MQ插件在底层使用Java,所以这可能是Java的问题。AS400可以

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

我们在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 explorer浏览消息时,我们也会看到数据元素值呈现为
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));
输出为:

二十五 十五

即,字节序列已被字节[]->字符串->字节[]更改 处理


MQ支持人员建议发送端将标识消息格式为MQSTR的消息属性更改为默认值(空白)。执行此操作后,MQ客户端不会尝试转换,TIBCO已从MQ客户端正确接收此转换。

由于符号(最后一个半字节)占用了1位数的空间(最后一个半字节),因此PackedDecimal数字应包含奇数位数。如果MQ explorer对数字的解释不正确,则不太可能是客户端的问题。最高数字总是递减1还是位向右移动?试试501和401。他们都变成201了吗?或者401和301?这只发生在25个系列中,其他的都可以。显然,25是一个换行符表示形式,当数据被解析时,它被替换为15。我们在工程构建中使用TIBCO支持来回移动,结果证明这是MQ客户端的一个问题。是否有人了解MQ客户端是否支持或它是开源的。数据是以字节而不是字符串的形式发送和接收的。解析字节时,以25开头的字节将替换为15。如果MQ发送原始字节,则客户端将获取原始字节,因此问题在于TIBCO或您的Java应用程序;感谢Danny,但是MQ核心系统不想对此进行任何更改。因此,我们最终调试并解决了问题。我将很快发布答案