我正在考虑编写OSGI包,并将其作为OSGI服务公开。现在,我想从另一个java模块调用这个OSGI服务,假设OSGI包和java模块在同一个JVM中运行。
是否可以从OSGI外部调用OSGI公开的服务?
提前致谢!
答案 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);
}
MyService
。这不是问题,因为您可以使用为FrameworkUtil.getBundle()
方法部署到OSGi容器的任何类,并且可以将字符串(FQCN)传递给BundleContext#getServiceReference()
方法。MyService
有多种实现方式。对BundleContext#getServiceReference()
的第二个参数使用LDAP过滤器,或调用BundleContext#getServiceReferences()
方法,该方法将返回一个数组或使用相同的代码并依赖ServiceRanking
。