问题描述
需求:有系统 A, B. 用户在A中做某一业务操作时往B实时集成信息,以在B中创建审批电子流。要求:不能对同样的业务信息,创建多个电子流。若检查到已存在电子流,不能再创建电子流也必须邮件通知用户。若创建电子流成功时,必须邮件通知用户。当前方案:采用XML+JMS + 消息驱动Bean做集成。 A把业务单据信息用XML格式发送到MQ服务器, B从服务器接收后做如下处理。设计如下,首先设计表: TABLE1 主要有一个clob字段来存放XML内容, 该表的意图是,存放原始的集成内容TABLE2 XML中包含的个字段。该表的设计意图是,提供页面或直接用SQL就可查看集成的信息,并且当不满足创建电子流条件时,可标识存放一下提示信息。TABLE3 在为电子流对应为正式的业务表,基本字段和TABLE2的字段一样。处理的流程:1. 把完整XML存到表TABLE1中。2. 解析XML文件成对应的数据,并存放到表TABLE2中3. 根据某一标识检查电子流(基本是在TABLE3表中查看是否存在相同标识的记录)是已创建电子流,如是则4,否则54. 发送错误提示信息5. 创建电子流,并发送邮件现在我在考虑,1.把这些处理全放在MDBean的onMessage方法中呢,2.还是把它们分为1)在MDB中只处理1和2。2)3至5由另外一个定时调度程序来做。调度程序每隔几分钟,扫描TABLE2, 从中取出未处理的集成数据,在做3至5的动作。对于2就没那么实时,不过两三分钟还是符合要求,但定时调度每次可能就会处理多条数据,不像在接收到信息时处理那样直接,一次处理一条数据。之所以想采用第二种方式,是觉得把这些操作放再一起不大好,想把接收数据,和与接收后相关处理分开。
解决方案
这主要看接受数据到处理数据到底耗不耗时。如果放在一起比较耗时间的话可以采用异步多线程处理。B专门接受,另开单独线程专门处理。存放的数据结构可以用一个阻塞队列,如ArrayBlockingQueue。如果接受到处理并不耗时,那就没必要这样处理了,来一条处理一条比较好,启用定时器定时扫描不太好,如果同一时间的并发消息量过大,很多消息都等定时器到时间来处理的话会引起拥堵。如果处理过程中又有接口调用这时候压力就更大了,用户体验这时候就不好了。