gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-30 08:52:49 26 4
gpt4 key购买 nike

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

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

最佳答案

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

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

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

关于java - 处理动态 OSGi 服务依赖性的最佳方式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30061032/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com