【问题标题】:When does ServiceTracker unget ServiceReference?ServiceTracker 何时取消获取 ServiceReference?
【发布时间】:2017-09-19 07:43:10
【问题描述】:

我在许多文章中读到,有必要在使用服务后立即取消服务。我是说

//1. get service
ServiceReference reference = bundleContext.getServiceReference(Foo.class.getName());
 Foo foo=(Foo) bundleContext.getService(reference);
//2. use service
 foo.foo();
//3. unget service
bunldeContext.ungetService(reference)

除了来自here

OSGi 框架为您维护每个服务的使用计数 捆绑。

这是一方面。另一方面,osgi 服务来来去去,因此在动态世界中,保留对 osgi 服务的引用是不好的做法,但在需要时获取服务是好的做法。

如果这个说法正确,那么 ServiceTracker 呢?据我了解,它会在服务到来时同时保留对服务和 ServiceReference 的引用,并保持它们直到服务结束。但是,ServiceReference 必须像使用服务一样被取消呢?或者在 ServiceTracker 的情况下,我们的意思是使用时间 = 跟踪器打开的时间的服务?

所以主要问题是 - ServiceTracker 何时取消 ServiceReference 以及为什么?

【问题讨论】:

    标签: java osgi


    【解决方案1】:

    您应该真正使用 OSGi 的声明式服务,而不是使用原始服务 API 甚至服务跟踪器。也就是说,Service Tracker 监听它正在跟踪的服务的服务事件。所以当服务未注册或跟踪器关闭时,它会取消服务。

    【讨论】:

      猜你喜欢
      • 2010-12-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-08-07
      • 2011-11-16
      • 1970-01-01
      • 2018-02-01
      • 2011-05-19
      相关资源
      最近更新 更多