背景:
1、项目中使用的osgi搭建的插件框架,各自负责各自的插件开发,提供接口;
2、Activator中实例化并注册接口实现的类;
问题:
任务调度的时,采取的多线程方式,同时多个任务采集、入库、出库、解析、下载等操作;
出现以下问题:1、数据库对象被前面的任务关闭,导致后面任务无法对数据库操作;
2、不同的采集任务出库解析后,存储位置混乱;
3、数据入库不完整;
4、各个插件的全局变量不会释放。
原因分析:
1、osgi注册进的对象,在框架启动的时候进行,都存储在context的上下文中,结果导致永久只有一个对象;
2、多线程共享一个对象,并对对象进行操作,造成各个线程出问题;
解决办法:
1、优化方法:在多线程中,被调度的类中尽量不要存在全局变量;
2、根本解决:注册进osgi的对象为工厂类,调用接口是使用工厂的getInstance获取相应的实例。