我试图了解from the OSGi specs,如果激活方法无限期阻塞会发生什么,但是我没有找到答案。另一方面,它表明Felix SCR具有ds.lock.timeout.milliseconds
和ds.stop.timeout.milliseconds
属性来管理激活/停用超时,对吗?
问题:
ds.lock.timeout.milliseconds
值是否明智?还是完全避免使用activate方法并使用context.registerService
在专用线程中“手动”注册服务会更好?答案 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(); }
}
此技术的优点是它允许许多初始化并行进行。
您需要的代表团很丑。如果性能不是太重要,则可以轻松创建一个代理来完成实际工作。