osgi - OSGi 包更新如何工作?

标签 osgi

当一个包被更新(比如修复一个错误)时,当前正在使用正在更新的包的其他包会发生什么?

假设有两个捆绑包 service 和 dao。假设当我发出更新 dao 层的命令时,服务包中的类正在使用 dao 包中的类。使用dao代码的service层类会出现异常吗?

感谢您的 response .

我的意思是说用相同的版本更新。

until a bundle refresh occurs which includes the dependent bundle.



包刷新操作是由用户更新包调用的,对吗?假设当用户调用 refresh 来更新 dao bundle 时,bundle service 中的一个类调用了 dao 层中的一个类的方法......这种情况下会发生什么?

我发现这篇博文很有帮助:
http://solutionsfit.com/blog/2008/08/27/osgi-what-modularity-can-do-for-you-part-1/

从帖子:

If we simply replace the bundle with a bundle that includes the fix, the container will unregister the old bundle and register the new bundle. The proxy can then handle the reference shuffling and resume the service invocation. This interaction will be almost instantaneous. Your customers will be completely oblivious to what has happened and you just saved your company a substantial amount of money (do I hear bonus?).



在这篇博文中,对 authorizePayment() 的调用被搁置,直到更新的包可用。如果在 bundle 刷新时控件在 authorizePayment() 方法中会发生什么?

最佳答案

捆绑包有两种依赖关系:

  • 服务,和
  • 之间的连接
    类加载器,由包键控
    名称。这些连接被称为
    电线。

  • 服务很容易撤回,因为这是他们设计的内在因素。电线更硬,因为它们错综复杂地编织在您的对象中,而这些对象不知道动态。所以当你安装一个新的 bundle 时,旧的 bundle 保持原样,你的对象不会更新,更新的 bundle 仍然像僵尸一样提供它的线路。

    当您调用 refreshPackages 时,框架会查看这些依赖项并找到引用这些僵尸的包。然后每个僵尸都被阻止。捆绑包的契约是它应该清理。我们通过为您进行大量清理来帮助捆绑包,但有些事情非常糟糕,例如将引用存储在其他包的静态中或忘记停止已启动的线程。以其他方式依赖于这些包的其他包会收到包停止的通知,因此它们也可以清理任何引用。捆绑包停止后,捆绑包未解析,然后针对新捆绑包再次解析。

    对于真正的 OSGi 包,清理是很自然的,并且在您的代码中并不真正可见(应该如此)。它得到了声明式服务、iPOJO、依赖管理器、Spring、Blueprint 等工具的良好支持。神奇之处在于关注 µservices 模型而不是 dong 类加载技巧。

    为什么我们不自动刷新?好吧,我们曾经这样做过,但刷新是破坏性的。在许多情况下,您需要更新多个捆绑包。每次更新后出现这种中断将是不必要的痛苦。也就是说,在安装或更新之后,您应该始终进行刷新,但您可以包含多个安装/更新。

    关于osgi - OSGi 包更新如何工作?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4330927/

    相关文章:

    java - 如何实例化多个 OSGi 服务?

    java - 处理拆分包 : Require-Bundle with maven-bundle-plugin

    java - 如何获取另一个jar中的资源

    java - iDempiere 在通过 Felix 控制台更新任何 OSGI 插件时多次启动

    java - 如何让eclipse插件更有吸引力?

    java - javac 足以构建 OSGi 包吗?

    java - OSGi `uses` 约束违规,即使存在兼容的导出器

    java - 如何更改 Eclipse OSGi Framework Launcher 使用的 OSGi Launcher Jar

    java - 使用 XStream 反序列化 XML 在 OSGi (Java 1.4) 中不起作用

    service - OSGi 声明式服务在运行时过滤引用