OSGi DS并手动停用组件

And*_*yuk 1 java osgi

如果我使用声明式服务,是否可以手动停用OSGi中的组件?

例如,假设我有一个组件,具有实现:

//component
class Overseer(){
       List<ServiceReference> serviceRefs = ...//populate

       private void doStuff(){
            serviceRef = serviceRefs[i];
            if(dontNeedThisAnymore){
               serviceRefs.remove(serviceRef);
               serviceRef.getBundle().stop();

            }
 }
Run Code Online (Sandbox Code Playgroud)

Nei*_*ett 5

执行此操作的最佳方法是使用ComponentContextAPI 从同一捆绑包中的另一个组件.

您可以编写一个组件,以便将其ComponentContext作为其activate方法的参数.该接口具有可用于启用/禁用同一捆绑中的其他组件的方法enableComponentdisableComponent方法.

我将其称为"网守"组件,因为它可用于在启用其他组件之前设置其他组件所需的资源.例如,您可能有多个组件需要在他们完成工作之前启动数据库...网守将负责启动数据库,然后调用enableComponent(null)以启用其他组件.同样,如果网守可以检测到数据库已关闭,那么在此时禁用其他组件.为了使其工作,除了网守之外的所有组件都需要在最初设置enabled="false".