0

我正在实现一个日志服务,它需要在整个 osgi 框架中映射数据流。

每次 clientbundle 想要使用来自另一个 bundle 的服务时,它都会首先从我的日志包中调用一个函数,它有点像这样:

JournalService.Journal(args);
NeededService.neededfunction(args);

我的日记服务需要以下内容:

  • 使用该服务的捆绑包的捆绑名称。
  • 提供服务的包的包名。
  • 将使用哪个服务。
  • 将使用服务的哪个功能(可能是字符串)
  • 函数参数。

我知道如何获得最后 2 个(我作为参数传递给我的日记:字符串函数名和对象 [] 参数)。但我不知道需要传递什么来获得前 3 个,并且需要最少的参数。

4

2 回答 2

1

如果您有 ServiceReference,则可以从中获取所有信息。我相信大多数框架在内心深处都使用 ServiceReferences 来引用捆绑包中的单个服务。

http://www.osgi.org/javadoc/r4v43/core/org/osgi/framework/ServiceReference.html

您可以获得您所引用的服务的捆绑包。如果包 A 从包 B 引用服务 B,则实例方法 ServiceReference.getBundle 将为您获取包 B,当前的 BundleContext 将为您获取包 A。

也就是说,您最好的选择可能是使用 ReferenceListeners 之类的东西(尽管您可能没有使用蓝图)。这将让您知道何时引用或取消引用服务并获取与其相关的所有上下文数据。另一种方法可能是使用 ServiceEvent,它可以让您监听注册/注销事件。如果您已经知道这一点,我深表歉意。

http://www.ibm.com/developerworks/xml/library/os-osgiblueprint/index.html#srms

http://www.osgi.org/javadoc/r4v43/core/org/osgi/framework/ServiceEvent.html

至于跟踪单个方法,一旦它们从 osgi 中拉出,您就可以代理您的引用。因此,bundle A 将引用来自 Bundle B 的 Service B。Bundle A 然后获取服务 B 的代理,该代理在被调用时委托给原始方法并调用您的 JournalService。

于 2013-07-18T14:38:42.143 回答
1

这是显示类似功能的文章:http: //java.dzone.com/articles/osgi-service-hook-log-all

它使用函数名称和参数注销每个方法调用,但它仍然不会注销捆绑名称。我认为如果代码以下列方式更改是可能的:

  • 当捕获到新的服务注册事件时,将注册不是代理服务而是 ServiceFactory 实现
  • ServiceFactory 将为每个捆绑请求(请求服务)实例化一个自定义代理,该代理为每个方法调用进行日志记录

在这种情况下,每个 Bundle-Service-Bundle 关系都会有一个自定义代理对象,以便他们可以注销您需要的信息。

好吧,在这种情况下,根本不需要从您的生产代码中登录。

有关 serviceFactory 的更多信息,请参阅http://www.osgi.org/javadoc/r4v43/core/org/osgi/framework/ServiceFactory.html

在 Hooks 中,您可以根据包名称或其他内容过滤服务(您在 ServiceFactory 中重新注册)。代理系统中的每个服务可能会导致一些性能下降。

于 2013-07-18T14:56:56.133 回答