处理动态 OSGi 服务依赖性的最佳方式

Best way to handle dynamic OSGi service dependencies

我有一个可选的服务依赖项,看起来像这样:

@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() 为 运行 时服务未绑定,我有问题,对吗?我是否需要在所有这些功能中添加同步块,或者是否有更好的方法来处理这种情况?

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

话说回来,你的代码有两个问题:

  1. testServiceRef 字段从未初始化。您应该在构造期间对其进行初始化,理想情况下将其设置为 final.
  2. unsetTestService 的实现不正确。在动态服务替换期间,"new" 服务的绑定发生 解除 "old" 服务的绑定之前。所以你需要检查被解除绑定的服务是否真的是你当前绑定的服务。您可以通过调用 testServiceRef.compareAndSet(testService, null).
  3. 来完成此操作