首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >持久声明服务激活方法

持久声明服务激活方法
EN

Stack Overflow用户
提问于 2019-07-28 15:49:16
回答 3查看 183关注 0票数 4

我试图理解来自OSGi规范,如果激活方法无限期地阻塞,它应该发生什么,但我没有找到答案。另一方面,Felix具有ds.lock.timeout.millisecondsds.stop.timeout.milliseconds属性来管理激活/停用超时,对吗?

问题:

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

回答 3

Stack Overflow用户

回答已采纳

发布于 2019-07-29 09:13:56

如果初始化时间过长,则标记组件immediate。在“激活”方法中,启动后台初始化。当您的服务被调用时,您会一直阻塞直到初始化完成为止。(承诺对这一技术非常有用。)

代码语言:javascript
复制
@Component(immediate=true)
public class FooImpl implements Foo {
   Promise<Foo>  promise;

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

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

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

你需要的代表团有点丑。如果性能不太重要,您可以很容易地创建一个代理来执行实际的工作。

票数 1
EN

Stack Overflow用户

发布于 2019-07-28 20:51:17

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

票数 4
EN

Stack Overflow用户

发布于 2021-10-21 08:39:04

正如这个视频Eclipse基金会的OSGI最佳实践中所建议的那样,您可以在一个独立的线程中开始持久的工作,然后手动注册您的服务。

代码语言:javascript
复制
@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>());
}
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/57242495

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档