是否可以从外部,从其他捆绑包同步 osgi 服务?
OsgiService oS = retrieveService(BundleContext);
synchronized(oS){
...
}
我不想让来自捆绑包外部的调用在内部特定方法执行期间进行更改。
捆绑包已注册并处于活动状态。我在 Equinox 框架下工作。
是否可以从外部,从其他捆绑包同步 osgi 服务?
OsgiService oS = retrieveService(BundleContext);
synchronized(oS){
...
}
我不想让来自捆绑包外部的调用在内部特定方法执行期间进行更改。
捆绑包已注册并处于活动状态。我在 Equinox 框架下工作。
不可以。当您发布一项服务时,您声明它是普遍可用的,对它的使用方式没有任何限制。例如,您不能限制其他包以特定顺序调用方法,或要求它们使用同步,或始终从特定线程调用。因此,您必须假设您将从任何线程调用,没有同步等。
如果您的服务实现的内部状态是脆弱的并且需要同步,那么您有责任在您的实现中执行它。你不能把这项工作强加给别人。
在特定的限制条件下,是的,因为 Equinox 框架不会为服务创建代理。然而,这是一个非常脆弱的解决方案,因为系统的其他部分可能会或可能不会同步这些调用......
你知道你可以替换 OSGi 中的服务吗?为您的用例创建一个支持所有适当接口的类,但该类作为具有比现有服务更高的SERVICE_RANKING属性的服务发布;这将导致在查找服务时首选此实例。现在,此类将所有方法调用委托给原始服务,它使用声明式服务、ServiceTracker 或 BundleContext 获得该服务;在所有情况下都使用 SERVICE_RANKING 的过滤器。这允许您拦截所有方法调用并记录或同步它们。
希望这可以帮助...