如果我使用声明式服务,是否可以手动停用OSGi中的组件?
例如,假设我有一个组件,具有实现:
//component
class Overseer(){
List<ServiceReference> serviceRefs = ...//populate
private void doStuff(){
serviceRef = serviceRefs[i];
if(dontNeedThisAnymore){
serviceRefs.remove(serviceRef);
serviceRef.getBundle().stop();
}
}
答案 0 :(得分:5)
执行此操作的最佳方法是使用ComponentContext
API从同一个捆绑包中的另一个组件。
您可以编写一个组件,以便ComponentContext
作为其activate方法的参数。该接口具有enableComponent
和disableComponent
方法,可用于启用/禁用同一捆绑包中的其他组件。
我将其称为“网守”组件,因为它可用于在启用其他组件之前设置其他组件所需的资源。例如,您可能有多个组件需要在他们完成工作之前启动数据库...网守将负责启动数据库,然后调用enableComponent(null)
以启用其他组件。同样,如果网守可以检测到数据库已关闭,那么在此时禁用其他组件。为了使其工作,除了网守之外,捆绑中的所有组件都需要首先设置为enabled="false"
。