我正在使用Apache Felix
进行自我更新应用程序,我似乎无法在更新后强行重启Felix
。我通过使用某种应用程序State
来做模拟重启过程的一些技巧。
public class LauncherActivator implements BundleActivator {
public static LauncherState State;
@Override
public void start(BundleContext context) throws Exception {
...
LauncherApplication.State = LauncherState.READY;
Platform.runLater(() -> {
try {
new LauncherApplication().start();
} catch (Exception ex) {
Logger.getLogger(LauncherActivator.class.getName()).log(Level.SEVERE, null, ex);
}
});
}
}
如果检测到更新,我只会将全局状态更改为LauncherAppliation.State = LauncherState.RESTART;
如果应用程序检测到State
中的更改,我只需致电BUNDLE_MAP.get('application.activator').update();
,BUNDLE_MAP
是某种HashMap
可以在开始时存储所有正在运行的包。
我测试了它并且它工作了,我可以在日志中看到激活器包正在更新并且简单的重启机制重新运行激活器捆绑包但有时它不会重新运行激活器捆绑包并且捆绑状态是已经ACTIVE
。
那么使用激活器包或任何捆绑包重启Apache Felix的正确方法是什么?
答案 0 :(得分:0)
这一切都在文档中!
Starting the Framework Instance
start()
方法用于启动框架实例。如果在调用init()
之前未调用start()
方法,则start()
会调用它。这两种方法导致两种不同的框架状态转换:
init()
导致框架实例处于Bundle.STARTING
状态。start()
导致框架实例处于Bundle.ACTIVE
状态。
init()
方法是必要的,因为框架在首次创建时没有BundleContext
,因此需要转换到Bundle.STARTING
状态才能获取其上下文(通过{ {1}})用于执行各种任务,例如安装捆绑包。请注意,Felix框架还提供了Bundle.getBundleContext()
属性,该属性用于类似目的,但不是标准的。felix.systembundle.activators
方法完成后,已执行以下操作:
- 启用了事件处理。
- 安装了安全管理器(如果已启用)。
- 框架设置为从0级开始。
- 捆绑缓存中的所有捆绑包都已生效,其状态设置为
init()
。- 框架获得有效的
Bundle.INSTALLED
。- 所有框架提供的服务均可用(例如
BundleContext
,PackageAdmin
等。)- 框架进入
StartLevel
状态。如果手动调用
Bundle.STARTING
方法,则需要调用start()
来启动框架实例。在已启动的框架上调用init()
或init()
无效。
Stopping the Framework Instance
要停止框架实例,请调用{em>异步停止框架的
start()
方法。要知道框架何时完成关闭序列,请使用stop()
方法等待直到完成。停止的框架将处于waitForStop()
状态。使用前面所述的Bundle.RESOLVED
方法的正常组合,可以重新启动框架。
启动框架非常简单,只涉及四个步骤:
- 定义一些配置属性。
- 获得框架工厂。
- 使用factory创建具有配置属性的框架。
- 调用
醇>init()/start()
方法。实际上,第一步是可选的,因为所有属性都有合理的默认值,但是如果你要创建一个启动器,你通常会想要更多,例如当你启动时自动安装和启动包。 / strong>框架实例。默认的Felix启动程序定义了可重用的功能,以便在框架启动时自动安装和/或启动捆绑包。