处理动态 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 引用使用原子引用。
话说回来,你的代码有两个问题:
testServiceRef
字段从未初始化。您应该在构造期间对其进行初始化,理想情况下将其设置为 final
.
unsetTestService
的实现不正确。在动态服务替换期间,"new" 服务的绑定发生 在 解除 "old" 服务的绑定之前。所以你需要检查被解除绑定的服务是否真的是你当前绑定的服务。您可以通过调用 testServiceRef.compareAndSet(testService, null)
. 来完成此操作
我有一个可选的服务依赖项,看起来像这样:
@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 引用使用原子引用。
话说回来,你的代码有两个问题:
testServiceRef
字段从未初始化。您应该在构造期间对其进行初始化,理想情况下将其设置为final
.unsetTestService
的实现不正确。在动态服务替换期间,"new" 服务的绑定发生 在 解除 "old" 服务的绑定之前。所以你需要检查被解除绑定的服务是否真的是你当前绑定的服务。您可以通过调用testServiceRef.compareAndSet(testService, null)
. 来完成此操作