spring在多并发情况下的场景应用

应用场景:在一个web应用中,程序需要通过一定协议定时或手动向另一部分硬件或软件推送差异数据,目标硬件或软件分布在不同的地方.

       这个需求很简单,在这里并不会考虑出错情况下的容错处理,考虑的是理想状态下的情况(网络正常,设备正常),但却会催生一些并发问题。在这里定时调用和手动调用推送数据是在同一个类中实现的.例如推送数据时会产生以下一种情况,定时推送过程中,数据还没有提交完成,数据已被更改,当推送的数据对象只有一个时候,这并不会明显产生问题,运行正常,但当推送数据的对象不断增加时,问题出来了,经过检查,发现程序运行完成时,只有一个或几个推送成功的,绝大部分目标硬件或软件并没有收到预期的数据,原因在哪里?原来是和spring的scope配置有关(关于这方面的知识可以从相关的技术文档或网上得到),scope默认情况下的属性值是singleton,即单例模式,全局共享一个对象,也就是说保存的数据是无状态的数据,每新增一个请求就把旧有的引用覆盖掉,于是又引申出一个关于java的堆和栈的问题,其实在java的堆和栈中旧数据还是存在的(关于java堆和栈的知识 可以从相关的技术文档或网上得到 ),但为什么依然只有一个或几个数据推送成功的?这就引出了关于spring的bean管理问题了,前面说过,spring的bean配置中scope是singleton,只要把scope的值改为prototype这个问题就基本解决了.

不过以为这个问题完全解决了,也就错了,以上解决的都是定时器调用的问题,还有一个问题是,当定时器在调用但未运行完成的时候,一个管理人员或几个管理人员也同时调用了针对同一个软件或硬件的数据推送方法,这时候出现会出现几个操作相同的线程,这对程序来说可不是什么好事情,对我们来说,我们希望推送的数据是需要的就行了,问题是需要怎么样的数据,最新的还是最旧的?如果需要最新的数据把scope设置为singleton就行了,但前面已经说过这会有问题。这里面如何控制?问题所在,解决的办法有多种,例如通过保存时间戳,设置优先级等,皆可针对需求而定.

猜你喜欢

转载自fmfl.iteye.com/blog/1392001