san*_*re6 7 osgi apache-camel blueprint-osgi apache-servicemix
我有一个要求,我需要每天重新加载我的osgi捆绑4次.重新加载bundle意味着重新创建静态实例Bean,重新加载camel路由,重新创建和注入线程池,数据库连接池..etc(其他spring xml东西).我尝试通过ssh刷新我的包,但我需要捆绑ID,以便可以改变加班.所以,我写了一个Manager Bundle,它通过符号名称获取捆绑包,并每天刷新它们4次
osgi impl : felix
container : apache-servicemix-4.4.1-fuse-03-06
Service Dependency spec : Blueprint
Run Code Online (Sandbox Code Playgroud)
有3个包和一个帮助包.帮助包包含所有使用的公共类和服务接口.这三个捆绑包之间没有代码共享(它们都没有导出任何包).所有这些捆绑包都通过camel vm端点和服务进行交互.我只刷新其他3个捆绑包,帮助捆绑包不提供任何服务.
现在,问题是当我对这3个捆绑包进行更新时,它们启动并正常工作,但我看到每次执行此操作时jconsole上增加了800-900个类.强制gc似乎也没有清理这些对象.那么,这些旧的有线物体会是什么呢?服务依赖项应该自动更新,并且bundle之间没有代码依赖关系.我检查了更新之前和之前的类数量的差异.
我可以看到一些类的数量增加了一倍,如org.apache.activemq.camel.component.VmComponent, org.apache.commons.dbcp.BasicDataSource ..etc和我在我的camel路由中定义的一些自定义bean.我依赖于camel-core,blueprint,quartz等容器.在camel-context中使用bean,VM端点等等,以及在更新时在blueprint-config xml中定义的组件.我知道一旦更新捆绑包,建议调用FrameworkWiring.refreshBundles().但是,我没有捆绑之间的代码共享,我推测任何其他依赖容器应该处理我认为现在是错误的.我不确定servicemix中当前的felix框架实现是否支持FrameworkWiring.refreshBundles()(ref),我无法让它工作.我该如何解决这个问题?
谢谢你好
我对 Camel 了解不多,但如果您为平台提供引用捆绑包类的可运行对象,那么您需要确保它们在刷新时全部被取消或以其他方式销毁,因为它们运行的线程将持有引用旧的类实例(它们与新包的类实例不同,尽管它们实际上是相同的)。因此,增加班级数量。
| 归档时间: |
|
| 查看次数: |
1124 次 |
| 最近记录: |