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



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

我们在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的问题?

我不熟悉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客户机正确地接收到此转换。

相关内容

  • 没有找到相关文章

最新更新