Osgi 持久声明性服务激活方法

Osgi 持久声明性服务激活方法,osgi,osgi-ds,Osgi,Osgi Ds,我试图理解在激活方法无限期阻塞的情况下应该发生什么,但我没有找到答案。另一方面,Felix SCR有ds.lock.timeout.millides和ds.stop.timeout.millides属性来管理激活/停用超时,对吗 问题: 为什么OSGi规范没有提到激活/停用死锁管理 如果DS需要更多的时间来运行其激活方法,那么增加默认的SCRDS.lock.timeout.millides值是否明智?还是完全避免使用activate方法,在专用线程中使用context.registerServ

我试图理解在激活方法无限期阻塞的情况下应该发生什么,但我没有找到答案。另一方面,Felix SCR有
ds.lock.timeout.millides
ds.stop.timeout.millides
属性来管理激活/停用超时,对吗

问题:

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

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

如果初始化时间较长,则将组件标记为立即。在activate方法中,启动后台初始化。调用服务时,您将阻塞,直到初始化完成。(这项技术的效果非常好。)

@组件(立即=真)
公共类FooImpl实现Foo{
承诺;
@激活void Activate(){promise=begin();}
@凌驾
public void foo(){promise.get().foo();}
}
这种技术的优点是它允许许多初始化并行进行

你需要的代表团有点难看。如果性能不太重要,您可以轻松创建一个代理来执行实际工作

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

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

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