如何获取使用我的导出包之一的Osgi包的Symbolic-Name?

时间:2010-04-08 14:51:22

标签: osgi bundle

在我的一个实现库中,我想知道来自哪个用户库请求?

捆绑A.  ClientCode - > ServiceInterface

捆绑B.  ClientCode - > serviceInterface等

捆绑C.  serviceInterface等  ServiceImpl。

这些接口由impl解决。捆绑(捆绑C)。在该捆绑包内,我想知道哪个捆绑请求来自(A或B)?

感谢。

2 个答案:

答案 0 :(得分:2)

您可以为接口方法添加BundleContext的参数。然后,当客户端代码调用您的服务时,传入其bundle上下文,您可以调用context.getBundle().getSymbolicName()或其他方法来获取有关调用来自的bundle的信息。

答案 1 :(得分:1)

正确的方法是使用ServiceFactory,如OSGi规范中所述。如果您将服务注册为服务工厂,则可以为每个“客户端”提供实现(其中“客户端”定义为捆绑包,调用您的服务)。这允许您知道谁在调用您,而客户端不必指定任何内容,因为添加名为BundleContext的参数显然不是好设计(除非没有其他方法)。

一些“伪”代码:

class Bundle_C_Activator implements BundleActivator {
  public void start(BundleContext c) {
    c.registerService(ServiceInterface.class.getName(),
      new ServiceFactory() {
        Object getService(Bundle b, ServiceRegistration r) {
          return new ServiceImpl(b); // <- here you hold on to the invoking bundle
        }
        public void ungetService(Bundle b, ServiceRegistration r, Object s) {}
      }, null);
  }
}

class ServiceImpl implements ServiceInterface {
  ServiceImpl(Bundle b) {
    this.b = b; // <- so we know who is invoking us later
  }
  // proceed here with the implementation...
}