我正在开发一个基于 OSGi 的系统,我打算定期“更新”而不关闭整个系统。我打算使用“更新”来促进捆绑更改,因此编写了一个小应用程序(2 个捆绑包)来尝试证明该理论。
我的最终目标:我正在尝试实现一个可以使用 OSGi 动态更新捆绑包的平台。
到目前为止:我已经制作了 2 个捆绑包;一个数学包(有 2 个可以相加和相乘的方法)和一个显示包,它有一个每秒运行的线程,生成 2 个随机数并使用前面提到的数学包对它们进行相加和相乘(并显示结果)。我正在使用声明性服务,因此在数学包中有一个组件定义,它导出由接口 IMath 定义的服务。同样,我在显示包中有一个组件定义,它订阅(1:1 静态)由 IMath 接口定义的服务。我在每个组件的启动/关闭的每个阶段都有典型的调试消息。
当项目启动时,我通常会看到:
Starting up Math...
Starting up Display...
Running the Display thread...
然后每一秒我都会看到显示线程进行计算。此外,我可以执行以下操作(假设数学是捆绑 1,显示是捆绑 2)。
> stop 1
Stopping the Display thread...
Display bundle has been shut down.
Math bundle has been shut down
> start 1
Starting up Math...
Starting up Display...
Running the Display thread...
问题:到目前为止一切都很好,对吧?在我尝试使用“更新”命令之前,一切都很好。在这种情况下,我想更新数学包,因为我在乘法计算中出错了。
> update 1
Stopping the Display thread...
Display bundle has been shut down.
Math bundle has been shut down
Starting up Math...
什么?为什么 ds 没有调用我的启动方法来重新启动显示包?我还尝试更新显示包,它似乎工作正常。我的感觉是,如果您更新捆绑包,它将重新启动,但是从更新的捆绑包订阅服务的任何捆绑包都将处于不确定状态。
更糟糕的是,如果我停止并启动显示包,它仍然无法启动!
我相当确定我正在以错误的方式看待某些事情,所以如果有人能对我的问题有所了解,那就太好了。如果有人想要源代码,请告诉我,我可以附上一些基本的 java 文件来演示问题。
如果我对我的问题不够具体,请告诉我,我会推断。
谢谢阅读!亚伦