【发布时间】: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.VmComponent, org.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