我有一个要求,我需要每天重新加载我的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
有3个捆绑包和一个帮助包。帮助包具有所有共同点 使用的类和服务接口。这三个捆绑包之间没有代码共享(它们都没有导出任何包)。所有这些捆绑包都通过camel vm端点和服务进行交互。我只刷新其他3个捆绑包,帮助捆绑包不提供任何服务。
现在,问题是当我对这3个捆绑包进行更新时,它们启动并正常工作,但我发现每次执行此操作时,jconsole上的类增加了800-900个。强制gc似乎也没有清理这些对象。那么,这些旧的有线物体会是什么呢?服务依赖项应该自动更新,并且bundle之间没有代码依赖关系。我检查了更新之前和之前的类数量的差异。
我可以看到某些类的数量增加了一倍,如 org.apache.activemq.camel.component.VmComponent , org.apache.commons.dbcp.BasicDataSource ..等以及我在骆驼路线中定义的一些自定义bean。我依赖于camel-core,blueprint,quartz等容器。在camel-context中使用bean,VM端点等等,以及在更新时在blueprint-config xml中定义的组件。我知道一旦更新捆绑包,建议调用FrameworkWiring.refreshBundles()。但是,我没有捆绑之间的代码共享,我推测任何其他依赖容器应该处理我认为现在是错误的。我不确定servicemix中当前的felix框架实现是否支持FrameworkWiring.refreshBundles()(ref),我无法使其工作。我该如何解决这个问题?
由于 sanre6
答案 0 :(得分:1)
通常,仅在bundle上调用更新是不够的。您必须在某些时候刷新您的包裹。如果一切都表现良好,这应该足以更新所有包布线,有效地允许旧版本的包被垃圾收集。但是,如果其中一个捆绑包中的某些内容不正常,并且在缓存中保持线程运行或某些资源,则必须开始追踪该问题。让自己成为一个好的探查者,看看这些" extra"对象属于并从那里出发。
答案 1 :(得分:0)
我对Camel了解不多,但是如果你为平台提供引用bundle类的runnables,那么你需要确保它们在刷新时被取消或以其他方式销毁,因为它们运行的线程将保留对旧类实例的引用(它们与新包的类实例不同,即使它们实际上是相同的)。因此,增加班级数。