前些日子,以前组里的同事参加一个POC测试,测试中有一个异常测试用例,就是在测试程序运行的时候,将流程kill掉来模仿系统宕机的情况,然后将流程重新启动,最后检查是否有数据丢失。这个测试用例出现了问题,最后检查数据,总共有几十万条数据,大约丢失了十几条。同事将他们的做流程发给我,让我帮忙看一下,流程大致如下:
该BW流程从JMS的Queue上接收消息,将消息进行处理后发送到另一个Queue中。流程中的JMS Queue Receiver的Acknowledge Mode是Auto。从这个流程中,不难判断出,出现数据丢失的原因是当kill掉BW流程的进程的时候,流程已经从JMS服务器上取到消息,但是整个流程还没有运行结束。因为JMS Queue Receiver使用了Auto Acknowledge方式,在Receiver接收到JMS消息的时候就会将消息从JMS Server中Confirm掉。如果这时流程被kill掉,JMS已经被Confirm掉,但是数据还没有处理完,这条数据就丢失了。
要解决这个问题,就要保证流程在运行完成之前,不要将消息数据从JMS服务器上Confirm掉,这样在流程重新启动的时候,就可以重新处理这个数据了。流程修改如下: