7

我有一个要求,我需要每天 4 次重新加载我的 osgi 包。重新加载一个包意味着重新创建静态实例 Bean,重新加载骆驼路由,重新创建和注入线程池,数据库连接池 ..etc(其他 spring xml 东西)。我尝试通过 ssh 刷新我的捆绑包,但我需要捆绑包 ID,因为它可以改变超时。所以,我写了一个Manager Bundle,它通过符号名称获取包并每天刷新4次。

          osgi impl : felix 

          container : apache-servicemix-4.4.1-fuse-03-06

          Service Dependency spec : Blueprint

有 3 个包和一个帮助包。帮助包包含所有常用的类和服务接口。这 3 个包之间没有代码共享(它们都没有导出任何包)。它们都通过骆驼 vm 端点和服务进行交互。我只刷新了其他 3 个包,而助手包不提供任何服务。

现在,问题是当我对这 3 个捆绑包进行更新时,它们会启动并正常工作,但每次执行此操作时,我都会看到 jconsole 上增加了 800-900 个类。强制 gc 似乎也没有清理这些对象。那么,这些旧的有线物体会是什么呢?服务依赖项应该会自动更新,并且包之间没有代码依赖项。我检查了更新前后类数的差异。

我可以看到某些类的数量翻了一番,例如org.apache.activemq.camel.component.VmComponentorg.apache.commons.dbcp.BasicDataSource ..etc 以及我在骆驼路线中定义的一些自定义 bean。我依赖于camel-core、blueprint、quartz...etc 的容器。camel-context 中的bean、VM endpoints..etc 和blueprint-config xml 中定义的组件在更新时会发生什么。我知道它建议在更新 bundle 后调用 FrameworkWiring.refreshBundles() 。但是,我在包之间没有代码共享,我认为任何其他依赖项容器应该处理我认为现在是错误的。而且我不确定 servicemix 中当前的 felix 框架实现是否支持 FrameworkWiring.refreshBundles() (参考),我无法让它工作。我该如何解决这个问题?

谢谢 sanre6

4

2 回答 2

1

通常,仅调用捆绑包的更新是不够的。您还必须在某些时候刷新您的包。如果一切正常,这应该足以更新所有包连接,有效地允许旧版本的包被垃圾收集。但是,如果其中一个包中的某些东西表现不佳,并且保持线程运行或缓存中的某些资源或其他东西,您必须开始追踪问题。给自己找一个好的分析器,看看这些“额外”对象属于什么包和类加载器,然后从那里开始。

于 2012-09-24T22:48:11.340 回答
0

我对 Camel 了解不多,但是如果您为平台提供引用捆绑类的可运行文件,那么您需要确保它们在刷新时都被取消或以其他方式销毁,因为它们正在运行的线程将持有引用旧的 Class 实例(它们与新包的 Class 实例不同,即使它们实际上是相同的)。因此,增加班级人数。

于 2012-04-19T06:11:19.043 回答