如果我使用声明式服务,是否可以手动停用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)
执行此操作的最佳方法是使用ComponentContextAPI 从同一捆绑包中的另一个组件.
您可以编写一个组件,以便将其ComponentContext作为其activate方法的参数.该接口具有可用于启用/禁用同一捆绑中的其他组件的方法enableComponent和disableComponent方法.
我将其称为"网守"组件,因为它可用于在启用其他组件之前设置其他组件所需的资源.例如,您可能有多个组件需要在他们完成工作之前启动数据库...网守将负责启动数据库,然后调用enableComponent(null)以启用其他组件.同样,如果网守可以检测到数据库已关闭,那么在此时禁用其他组件.为了使其工作,除了网守之外的所有组件都需要在最初设置enabled="false".