取消确认后我还可以使用服务实例吗?

时间:2014-06-05 11:33:15

标签: osgi

这是一个有效的操作吗?

final IOSGiService service = (IOSGiService) bundleContext.getService(reference);
bundleContext.ungetService(reference);
service.executeSomeOperaton();

我每次都能安全地运行方法executeSomeOperaton()吗?

1 个答案:

答案 0 :(得分:1)

您将拥有该对象,您将能够在其上调用函数。但是,您无法确定对象是否仍处于正确状态。如果服务提供商关闭了该功能所需的一些资源,该怎么办?

您不应该以这种方式使用服务。即使您没有调用 unget(),当您在其上调用该函数时,您甚至无法确定该服务是否处于正确状态。您应该使用Felix Felix SCR之类的技术。在这种情况下,如果引用不再可用,则将停用对象,或者如果指定引用为动态,则将在对象上调用unbind方法。从那以后,您就会知道该服务何时真正可用。

使用的替代方法:Apache Felix iPojoApache Aries Blueprint或使用ServiceTracker来捕获您使用的服务的事件。

<强>更新

所以换句话说,取消服务与否将完全没有区别,除非我真的想让服务使用计数器保持正确吗?

有些情况下,取消服务真的很重要。例如,如果提供者注册了ServiceFactory而不是服务对象本身,则可以在提供者端捕获unget事件。在这种情况下,只要在服务上调用unget,就可以释放资源。

我记得当消费者包被停止时(但我不确定),会检索消费者包的所有服务引用(unget被调用)。