持久声明服务激活方法

时间:2019-07-28 15:49:16

标签: osgi osgi-ds

我试图了解from the OSGi specs,如果激活方法无限期阻塞会发生什么,但是我没有找到答案。另一方面,它表明Felix SCR具有ds.lock.timeout.millisecondsds.stop.timeout.milliseconds属性来管理激活/停用超时,对吗?

问题:

  • 为什么OSGi规范未提及激活/停用死锁管理?
  • 如果DS需要更多时间来运行其激活方法,增加默认SCR ds.lock.timeout.milliseconds值是否明智?还是完全避免使用activate方法并使用context.registerService在专用线程中“手动”注册服务会更好?

2 个答案:

答案 0 :(得分:2)

据我所知,唯一安全的方法是在异步代码完成后在激活中生成另一个线程并注册服务。

答案 1 :(得分:1)

如果初始化时间较长,请标记组件immediate。在activate方法中,您将启动后台初始化。调用服务时,您将阻塞直到初始化完成。 (此技术的工作原理非常好。)

@Component(immediate=true)
public class FooImpl implements Foo {
   Promise<Foo>  promise;

   @Activate void activate() { promise = begin(); }

   @Override
   public void foo() { promise.get().foo(); }
}

此技术的优点是它允许许多初始化并行进行。

您需要的代表团很丑。如果性能不是太重要,则可以轻松创建一个代理来完成实际工作。