处理动态OSGi服务依赖关系的最佳方法

时间:2015-05-05 18:54:37

标签: java osgi declarative-services

我有一个可选的服务依赖项,如下所示:

@Component
class TestComponent {
  private AtomicReference<TestService> testServiceRef;

  @Reference(type = '?')
  protected void setTestService(TestService testService) {
    testServiceRef.set(testService);
  }
  protected void unsetTestService(TestService testService) {
    testServiceRef.set(null);
  }

  public void doStuff() {
    TestService testService = testServiceRef.get();
    if (testService != null)
      testService.performSomeTask();
  }
}

现在,如果服务在testService.performSomeTask()运行时被解除绑定,我有一个问题,对吗?我是否需要在所有这些功能中添加同步块,还是有更好的方法来处理这种情况?

1 个答案:

答案 0 :(得分:2)

您不需要使用同步原子引用。我通常建议对具有动态策略的DS引用使用原子引用。

话虽如此,您的代码存在两个问题:

  1. 永远不会初始化testServiceRef字段。您应该在构建期间对其进行初始化,最好将其设为final
  2. unsetTestService的实施不正确。在动态服务替换期间,“新”服务的绑定在“旧”服务解除绑定之前发生。因此,您需要检查未绑定的服务是否实际上是您当前绑定的服务。您可以致电testServiceRef.compareAndSet(testService, null)
  3. 来执行此操作