重启Apache Felix

时间:2015-06-30 22:27:12

标签: java-8 apache-felix

我正在使用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的正确方法是什么?

1 个答案:

答案 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
  •   
  • 所有框架提供的服务均可用(例如BundleContextPackageAdmin等。)
  •   
  • 框架进入StartLevel状态。
  •   
     

如果手动调用Bundle.STARTING方法,则需要调用start()来启动框架实例。在已启动的框架上调用init()init()无效。

Stopping the Framework Instance

  

停止框架实例,请调用{em>异步停止框架的start()方法。要知道框架何时完成关闭序列,请使用stop()方法等待直到完成。停止的框架将处于waitForStop()状态。使用前面所述的Bundle.RESOLVED方法的正常组合,可以重新启动框架。

Launching a Framework

  

启动框架非常简单,只涉及四个步骤:

     
      
  1. 定义一些配置属性。
  2.   
  3. 获得框架工厂。
  4.   
  5. 使用factory创建具有配置属性的框架。
  6.   
  7. 调用init()/start()方法。
  8.         

    实际上,第一步是可选的,因为所有属性都有合理的默认值,但是如果你要创建一个启动器,你通常会想要更多,例如当你启动时自动安装和启动包。 / strong>框架实例。默认的Felix启动程序定义了可重用的功能,以便在框架启动时自动安装和/或启动捆绑包。