在equinox OSGi中,我正在使用来自多个不同捆绑包的服务(DS),我想知道每次使用它的服务。
服务写入数据库,我想知道哪个包写了什么。
buildin LogService必须能够执行此操作,因为它知道谁编写了每个日志行,但我无法弄清楚如何。
最简单的解决方案是将每个方法中的bundle名称添加到服务中,但我希望有一个更优雅的解决方案。
答案 0 :(得分:3)
这正是ServiceFactory
的用法,参见OSGi Core R6规范第5.9节。 “服务工厂”。
更新以指定DS使用情况。
这可以通过在scope=ServiceScope.BUNDLE
注释上使用@Component
来实现。然后,您可以通过允许ComponentContext
注入您的activate方法并调用getUsingBundle()
来访问调用包。例如:
@Component(scope = ServiceScope.BUNDLE)
public class MyComponent implements MyService {
private Bundle usingBundle;
@Activate
void activate(ComponentContext context) {
this.usingBundle = context.getUsingBundle();
}
// ...
}
在低级别,这通过将服务注册为ServiceFactory
的实例而不是普通服务对象来工作。当OSGi代表使用者获得服务时,它会调用getService
方法,该方法将使用者Bundle对象传递给服务的提供者。这对消费者完全透明地发生,即他们根本不需要改变他们的代码。
答案 1 :(得分:-2)
将包名称或Bundle对象添加到从服务客户端传递到服务的对象。通过这样做,您可以找到每个服务呼叫的客户端。
您提到了LogService。它使用LogEntry class将带有日志消息的Bundle对象传递给服务。