【问题标题】:How do I call OSGI service from outside OSGI?如何从 OSGI 外部调用 OSGI 服务?
【发布时间】:2016-11-22 05:16:30
【问题描述】:

我正在考虑编写 OSGI 包并将其公开为 OSGI 服务。现在,我想从另一个 java 模块调用这个 OSGI 服务,假设 OSGI 包和 java 模块都运行在同一个 JVM 中。

是否可以从 OSGI 外部调用 OSGI 公开服务?

提前致谢!

【问题讨论】:

  • 您能否更准确地描述您所说的“另一个 java 模块”的性质?这是什么?

标签: osgi-bundle


【解决方案1】:

BundleContext 是获取ServiceReference 所必需的,而ServiceReference 是获取Service 所必需的。

假设MyService 在您的类路径中,并且在 OSGi 容器中只有一个实现服务:

import org.osgi.framework.BundleContext;
import org.osgi.framework.FrameworkUtil;
import org.osgi.framework.ServiceReference;

[...]

BundleContext bundleContext = FrameworkUtil.getBundle(MyService.class).getBundleContext();
ServiceReference<MyService> serviceReference = bundleContext.getServiceReference(MyService.class, null);
try {
    MyService myService = bundleContext.getService(serviceReference);
    // do something with myService
} finaly {
    bundleContext.ungetService(serviceReference);
}

变化

  1. MyService 在您的类路径中不可用。这不是问题,因为您可以将部署到 OSGi 容器的任何类用于 FrameworkUtil.getBundle() 方法,并且可以将字符串 (FQCN) 传递给 BundleContext#getServiceReference() 方法。
  2. MyService 有多种实现方式。对BundleContext#getServiceReference() 的第二个参数使用LDAP 过滤器或调用BundleContext#getServiceReferences() 方法,该方法将返回一个数组或使用相同的代码并依赖ServiceRanking

【讨论】:

  • 你真的试过这个吗?我遇到了类加载器问题或导入问题。
  • 是的,我将它与 OSGi 4 和 Karaf 4 一起使用。你应该检查像 getBundle() 这样的 NPE 可以返回 null,否则没问题。
猜你喜欢
  • 2013-06-14
  • 2014-09-09
  • 2014-08-24
  • 1970-01-01
  • 2012-01-26
  • 2014-03-12
  • 2016-11-27
  • 2019-09-02
  • 2017-03-07
相关资源
最近更新 更多