如何从OSGI外部调用OSGI服务?

时间:2016-11-22 05:16:31

标签: osgi-bundle

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

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

提前致谢!

1 个答案:

答案 0 :(得分:1)

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