找出捆绑服务的服务

时间:2018-02-01 07:18:52

标签: java osgi osgi-bundle

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

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

buildin LogService必须能够执行此操作,因为它知道谁编写了每个日志行,但我无法弄清楚如何。

最简单的解决方案是将每个方法中的bundle名称添加到服务中,但我希望有一个更优雅的解决方案。

2 个答案:

答案 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对象传递给服务。