OSGi DS&手动停用组件

时间:2011-09-29 22:44:48

标签: java osgi

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

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

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

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

            }
 }

1 个答案:

答案 0 :(得分:5)

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

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

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