多线程情况下如果保持对象状态的一致性

         
yawn
07-10-19 3 459

小弟正在做一个项目遇到一个问题:
一个轮询线程采集网络数据,然后将采集到的数据推入Queue,另一个线程从Queue中取出数据,对数据进行处理,并将数据存到数据库。

我这样设计:轮询采集定义为一个采集任务BaseTask,BaseTask有几个状态:告警状态(未发生告警、发生告警、清除告警,这个告警状态是根据采集到的网络数据决定的)、任务状态(未完成、已完成、任务终止、任务异常),任务状态是在轮询线程中修改的,因为采集任务可能发生可能发出异常,就要将任务状态改为任务异常,然后修改BaseTask数据库中任务状态。

由于数据量较大我为数据处理设定了一个Queue,数据处理线程从queue中取数据计算,计算的值可能超出某个范围,就要修改BaseTask的告警状态为发生告警,同时修改BaseTask数据库中告警状态为告警。


这样就遇到了问题,告警状态可能和任务状态在同一时间可能不一致。原来想将告警状态和任务状态在数据处理线程中保存,此时由于Queue的延迟,任务状态,并不是最新的,这样更糟糕的是,用户客户端还要界面上显示BaseTask,看的任务状态也不是最新的

yawn
2007-10-19 11:59

自己顶一个

banq
2007-10-20 21:24

不建议螺丝壳里做道场,由于你这个应用数据量较大,重新考虑JMS异步架构,底层多线程已经是成熟的组件,拿过来用就可以,在其基础再搭建你自己的业务状态和处理。

yawn
2007-10-22 21:44

谢谢 banq