Java 找出哪个捆绑包调用服务

Java 找出哪个捆绑包调用服务,java,osgi,osgi-bundle,Java,Osgi,Osgi Bundle,在equinox OSGi中,我使用的是来自几个不同捆绑包的服务(DS),我想知道每次谁在使用它 服务写入数据库,我想知道哪个包写入什么 BuildinLogService必须能够做到这一点,因为它知道每个日志行是谁写的,但我不知道如何写的 最简单的解决方案是在每个方法中将捆绑包的名称放在服务中,但我希望有一个更优雅的解决方案。将捆绑包名称或对象添加到从服务客户端传递到服务的对象中。通过这样做,您可以找到每个服务调用的客户机 你提到了后勤服务。它使用将带有日志消息的Bundle对象传递给服务。这

在equinox OSGi中,我使用的是来自几个不同捆绑包的服务(DS),我想知道每次谁在使用它

服务写入数据库,我想知道哪个包写入什么

BuildinLogService必须能够做到这一点,因为它知道每个日志行是谁写的,但我不知道如何写的

最简单的解决方案是在每个方法中将捆绑包的名称放在服务中,但我希望有一个更优雅的解决方案。

将捆绑包名称或对象添加到从服务客户端传递到服务的对象中。通过这样做,您可以找到每个服务调用的客户机


你提到了后勤服务。它使用将带有日志消息的Bundle对象传递给服务。

这正是
ServiceFactory
的用途,请参见OSGi Core R6规范第5.9节。“服务工厂”

在澄清问题后更新如下,以指定DS用途

这可以通过在
@组件上使用
scope=ServiceScope.BUNDLE
来实现。然后,您可以通过将
ComponentContext
注入激活方法并调用
getUsingBundle()
来访问调用包。例如:

@组件(scope=ServiceScope.BUNDLE)
公共类MyComponent实现MyService{
使用Bundle的私有Bundle;
@激活
无效激活(组件上下文){
this.usingBundle=context.getUsingBundle();
}
// ... 
}

在底层,这通过将服务注册为
ServiceFactory
的实例而不是普通的服务对象来实现。当OSGi代表消费者获得服务时,它调用
getService
方法,将消费者绑定对象传递给服务的提供者。这对消费者来说是完全透明的,也就是说,他们根本不需要更改代码。

不,日志服务使用服务工厂。