3

我有一个庞大的应用程序和库生态系统,它们目前作为 .jar 集合部署在各种应用程序服务器(例如 JBoss AS)中,我正在尝试找出一套好的工具来管理依赖关系和生命周期各种包。

我认为这些包处于(至少)三种可能状态之一:“卸载”、“待处理”和“加载”,大致定义如下:

  • Unloaded:该软件包目前不可用。
  • Pending:包本身可用,但不是所有依赖项。因此,目前无法使用。
  • Loaded:包可用并且所有依赖项都满足。如果它是一个应用程序,它可以运行 - 如果它是一个库,它可以被另一个包使用。

(可能还有更多状态,例如尝试加载但由于其他原因而失败的包的“失败”,而不是不满足依赖关系等...)

在包的生命周期中,许多事情可能会导致包在这三者之间改变状态:

  • 一个没有依赖关系的包被加载,并且从unloaded变为loaded
  • 一个包试图加载,但并不是所有的依赖都得到满足;它从unloaded变为pending
  • 处于挂起状态的包突然满足了所有依赖项(因为其他一些包进入了已加载状态),并自动开始加载自己;从挂起过渡到加载
  • 一个包被卸载。依赖于现在卸载的包的所有已加载包从加载挂起
  • 软件包更新到较新的版本。所有依赖包都会自动重新加载,以访问更新的版本。

我已经开始使用 OSGi 来定义依赖项——它与我们的构建系统很好地兼容并产生可靠的依赖项信息。但是,如果我将两个 OSGi 包加载A到依赖于的BJBoss 中,然后 unload ,似乎很高兴继续运行。我知道有一些钩子可以用来在低级别(框架事件)上控制它,但是我的蜘蛛感觉很刺痛,说必须有更好的方法来做到这一点BAAB

是否有一个很好的工具/框架/任何你想调用的东西,可以在这些方面补充 OSGi?

4

2 回答 2

4

在 OSGi 中,现有的类加载器将保持活动状态,直到您刷新框架。因此,如果您卸载 B(其中 A 取决于 B),那么 A 将继续快乐地搅动,直到您刷新为止。您可以刷新整个框架或仅刷新受给定捆绑包影响的捆绑包(例如刷新 B)。

刷新的目的是更新/卸载/安装一组捆绑包,然后在“原子”操作中应用更改。

旧的(也是最常用的模型)是获取 PackageAdmin 服务,然后调用refreshPackages(null)它(osgi.org/javadoc/r4v43/core/org/osgi/service/packageadmin/...)。但是,此服务已被弃用。所以目前的方式是:

 FrameworkWiring fw = context
     .getBundle(0)
     .adapt(FrameworkWiring.class);
 fw.refreshBundles(null);

更新

于 2013-06-18T17:16:12.960 回答
1

如果您声明模块之间的依赖关系,则生命周期得到妥善管理,并且必须在顶级模块停止之前停止后代依赖。

但是,停止模块只不过是向捆绑激活器发送事件并从类加载器中删除引用。任何活动(例如线程或分布式实例)都必须手动清理。例如,您必须调用 org.apache.commons.logging.LogFactory.release(ClassLoader) (如果使用公共日志记录)或删除任何注入的 UI 组件。

于 2013-06-18T13:49:03.330 回答