查找哪个捆绑包呼叫服务

问题描述 投票:1回答:2

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

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

buildin LogService必须能够执行此操作,因为它知道谁写了每个日志行,但是我不知道如何写。

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

java osgi osgi-bundle
2个回答
3
投票

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

以下更新,在澄清问题后可以指定DS的用法。

这可以通过在scope=ServiceScope.BUNDLE批注上使用@Component来实现。然后,您可以通过允许将ComponentContext注入到您的激活方法中并调用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对象传递给服务的提供者。对于消费者而言,这是完全透明的,也就是说,他们根本不需要更改代码。


-2
投票

在您从服务客户端传递给服务的对象中添加捆绑名称或Bundle对象。这样,您可以找到每个服务呼叫的客户端。

您提到了LogService。它使用LogEntry class将带有日志消息的Bundle对象传递给服务。

© www.soinside.com 2019 - 2024. All rights reserved.