使用IBM WebSphere Message Broker 与 WebSphere MQ 遇到问题与解决。

1、发送方中止轮询数据库

经查为ESQL没有对提取数据作控制,直接使用ESQL SELECT * FROM 源表,因为源表数据量过大,导致自动轮询中止(暂不清楚WMB轮询详细控制机制)。函数

解决:定义SQL,使用PASSTHRU()函数,控制发送方数据采集量。spa

DECLARE SQL CHARACTOR 0;调试

SET SQL = 'SELECT ... WHERE ...';code

SET InputLocalEnvironment.Variables.temp[] = PASSTHRU(SQL);队列

2、时间类型(时间戳TIMESTAMP)致使问题element

交换队列莫名堵塞,调试报TIMESTAMP类型字段异常,有时候又正常。经查发现从DB2库中取出的同一表中相同字段,有些时候是yyyy-MM-dd HH:mm:ss.sss,有时候是yyyy-MM-dd HH:mm:ss(仍不清楚何种缘由形成)。table

解决:将该类型字段在ESQL中作截取处理,使生成的XML数据保持格式一致。乱码

CAST(SUBSTRING(REPLACE(InputRoot.XMLNSC.Data.XXX[I].YYY,'T',' ') FROM 1 FOR 19) AS TIMESTAMP FORMAT 'yyyy-MM-dd HH:mm:ss')
数据类型

3、数据类型问题

ESQL不支持DECFLOAT类型,发送端在从含有DECFLOAT类型的表中读取数据生成XML消息报错。

解决:将DECFLOAT类型改变为DECIMAL(X,Y)类型。

4、XML消息字符问题

部分时候出现XML消息解析错误:

An invalid XML character (Unicode: 0x8) was found in the element content of the document.

解决:在ESQL中在生成XML消息时处理。

REPLACE(InputRoot.XMLNSC.Data[I].XXX,'0x8','');

5、ODBC驱动支持问题

使用ODBC驱动链接ORACLE数据库时,因为ODBC驱动类型不支持NVARCHAR2类型,导致WMB没法读取数据。

解决:修改数据库类型,使用VARCHAR2。

6、数据乱码问题

因为数据存在乱码,致使生成XML消息报错:

unconvertable character

解决:一、将原库数据清洗,去除乱码数据。二、修改MQ发送接收方队列字符集(如非必须不建议使用,需确保字符集与C&S端数据库字符集与MQ队列字符集一致或是数据库字符集子集)。