Apache camel 更新osgi捆绑包的问题

Apache camel 更新osgi捆绑包的问题,apache-camel,osgi,apache-servicemix,blueprint-osgi,Apache Camel,Osgi,Apache Servicemix,Blueprint Osgi,我需要每天重新加载4次osgi捆绑包。重新加载bundle意味着重新创建静态实例bean、重新加载camel路由、重新创建和注入线程池、数据库连接池等等(其他SpringXML内容)。我试图通过ssh刷新我的捆绑包,但我需要捆绑包id,它可以随着时间的推移而改变。因此,我编写了一个管理器包,它通过符号名获取包,并每天刷新4次 osgi impl : felix container : apache-servicemix-4.4.1-fuse-03-06

我需要每天重新加载4次osgi捆绑包。重新加载bundle意味着重新创建静态实例bean、重新加载camel路由、重新创建和注入线程池、数据库连接池等等(其他SpringXML内容)。我试图通过ssh刷新我的捆绑包,但我需要捆绑包id,它可以随着时间的推移而改变。因此,我编写了一个管理器包,它通过符号名获取包,并每天刷新4次

          osgi impl : felix 

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

          Service Dependency spec : Blueprint
有3个包和一个助手包。助手包具有所有公共 使用的类和服务接口。这3个bundle之间没有代码共享(它们都没有导出任何包)。它们都通过camel-vm端点和服务进行交互。我只刷新其他3个包,而helper包不提供任何服务

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

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

谢谢
sanre6

我对Camel不太了解,但是如果您为平台提供引用捆绑类的可运行程序,那么您需要确保它们在刷新时都被取消或以其他方式销毁,因为它们运行的线程将保留对旧类实例的引用(与新bundle的类实例不同,尽管它们实际上是相同的)。因此,增加类计数。

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

您是否有来自旧捆绑包实例的线程挂起?是的,它们的数量已经翻了一番。您是想说我必须关闭实例,在更新捆绑包之前关闭驼峰路由吗?我们发现了相同的问题。切换到equinox实现会使此问题消失,然后我怀疑n Felix OSGI容器存在问题。我的应用程序严重依赖servicemix捆绑包,我认为最好的做法是让容器处理您的依赖关系,识别所有这些依赖关系并清除它们将是一项非常痛苦的工作。我甚至不确定您是否可以删除核心OSGI和与蓝图相关的依赖关系在更新包之前