我试图理解来自OSGi规范,如果激活方法无限期地阻塞,它应该发生什么,但我没有找到答案。另一方面,Felix具有ds.lock.timeout.milliseconds和ds.stop.timeout.milliseconds属性来管理激活/停用超时,对吗?
问题:
ds.lock.timeout.milliseconds值是否明智?还是最好完全避免激活方法,并在专用线程中使用context.registerService“手工”注册服务?发布于 2019-07-29 09:13:56
如果初始化时间过长,则标记组件immediate。在“激活”方法中,启动后台初始化。当您的服务被调用时,您会一直阻塞直到初始化完成为止。(承诺对这一技术非常有用。)
@Component(immediate=true)
public class FooImpl implements Foo {
Promise<Foo> promise;
@Activate void activate() { promise = begin(); }
@Override
public void foo() { promise.get().foo(); }
}这种技术的优点是它允许许多初始化并行进行。
你需要的代表团有点丑。如果性能不太重要,您可以很容易地创建一个代理来执行实际的工作。
发布于 2019-07-28 20:51:17
据我所知,唯一安全的方法是在完成异步代码时在activate中生成另一个线程并注册服务。
发布于 2021-10-21 08:39:04
正如这个视频Eclipse基金会的OSGI最佳实践中所建议的那样,您可以在一个独立的线程中开始持久的工作,然后手动注册您的服务。
@Activate
public void activate(BundleContext context) {
this.context = context;
this.reg = CompletableFuture.supplyAsync(this::longRunning);
}
@Deactivate
public void deactivate() {
this.reg.thenAcceptAsync(ServiceRegistration::unregister);
}
private ServiceRegistration<TaskService> longRunning() {
// long running call
return context.registerService(TaskService.class, this, new Hashtable<String, String>());
}https://stackoverflow.com/questions/57242495
复制相似问题