【问题标题】:Issue with updating osgi bundles更新 osgi 包的问题
【发布时间】:2012-04-18 04:59:39
【问题描述】:

我有一个要求,我需要每天 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 个 bundle 和一个 helper bundle。这个 helper bundle 有所有常见的 使用的类和服务接口。这 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() (ref),我无法让它工作。我该如何解决这个问题?

谢谢 sanre6

【问题讨论】:

  • 你有来自旧包实例的线程吗?
  • 是的,他们的人数翻了一番。你是想说我必须关闭我的实例,在更新捆绑包之前关闭骆驼路线吗?
  • 我们发现了同样的问题。切换到Equinox实现使这个问题消失了,然后我怀疑Felix OSGI容器有问题。

标签: apache-camel osgi apache-servicemix blueprint-osgi


【解决方案1】:

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

【讨论】:

    【解决方案2】:

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

    【讨论】:

    • 我的应用程序严重依赖于 servicemix 包,我相信最佳实践是让容器处理您的依赖项,识别所有这些依赖项并清除它们将是很多痛苦的工作。我什至不确定如果您可以在更新捆绑包之前删除核心 osgi 和蓝图相关的依赖项
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2023-04-08
    • 1970-01-01
    • 1970-01-01
    • 2017-06-05
    • 2011-04-22
    • 2016-08-20
    • 2017-09-10
    相关资源
    最近更新 更多