2

在 OSGi 中使用声明式服务时,我遇到了一个特殊的用例:

有时您希望 ds 组件在长时间操作完成后立即注册服务。通常这不是问题,因为服务将在激活方法完成后注册。但是,有时需要在 activate 方法中打开一个线程(以避免线程阻塞),并在线程完成工作后注册服务,例如

@Component
public class MyClass implements MyService {

   private ExecutorService executor = Executors.newCachedThreadPool();

@Activate
public void start(final BundleContext context) {
  executor.execute(new Runnable() {

  @Override
  public void run() {

    ...   // doing something for long

     context.registerService(MyService.class, MyClass.this, null);
  }
  });
 }
}

我们想出了一个 util 类来做这件事(并涵盖了组件在线程仍在运行时停止等问题)。有没有更好的方法来做这样的事情?如果没有,在框架中添加这样一个util类不是很方便吗?

最好的问候,迈克

4

1 回答 1

1

DS 不直接支持此用例。您使用BundleContext来显式注册服务的解决方案是最好的解决方案。

您还需要注意防止 DS 在您的激活方法完成后立即自动注册服务。您应该通过将注释provide上的属性设置@Component为空数组来做到这一点:

@Component(provide = {})

或者,不要让组件类直接实现服务接口;使用类似内部类的东西。

于 2013-08-08T15:42:13.730 回答