Java 如何获得捆绑包的符号名称,我使用哪种服务?

Java 如何获得捆绑包的符号名称,我使用哪种服务?,java,osgi,Java,Osgi,我正在实现一个日志服务,它需要映射整个osgi框架中的数据流 每次clientbundle想要使用来自另一个bundle的服务时,它都会首先从我的日志包中调用一个函数,该函数有点像这样: JournalService.Journal(args); NeededService.neededfunction(args); 我的日记服务需要以下物品: bundlename使用服务的捆绑包的名称 bundlename提供服务的捆绑包的名称 将使用哪种服务 将使用服务的哪个函数(可能是字符串) 函数参

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

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

JournalService.Journal(args);
NeededService.neededfunction(args);
我的日记服务需要以下物品:

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

我知道如何获取最后2个参数(我将其作为参数传递给日志:String functionname和Object[]args)。但是我不知道需要传递什么来获得前3个,并且需要最少的参数

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

您可以获得正在引用的服务包。如果bundle A从bundle B引用服务B,那么实例方法ServiceReference.getBundle将为您获取bundle B,当前BundleContext将为您获取bundle A

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


至于跟踪单个方法,您可以在引用从osgi中取出后代理它们。因此,bundle A将从bundle B中引用服务B。bundle A然后获得服务B的代理,当调用该代理时,代理原始方法并调用您的JournalService

以下是一篇展示类似功能的文章:

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

  • 当发生新的服务注册事件时,不会注册代理服务,而是注册ServiceFactory实现
  • ServiceFactory将为每个bundle请求(请求服务)实例化一个定制代理,为每个方法调用进行日志记录
在这种情况下,每个Bundle服务Bundle关系都会有一个自定义代理对象,这样它们就可以注销您所需的信息

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

有关serviceFactory的更多信息,请参阅

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