我正在考虑编写OSGI包,并将其公开为OSGI服务。现在,我想从另一个java模块调用这个OSGI服务,假设OSGI和java模块运行在同一个JVM中。
这有可能从OSGI外部调用OSGI公开服务吗?
提前感谢!
发布于 2017-06-29 17:21:18
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在您的类路径中不可用。这不是一个问题,因为您可以使用部署到OSGi容器中的FrameworkUtil.getBundle()方法的任何类,并且可以将一个字符串(FQCN)传递给BundleContext#getServiceReference()方法。MyService有多个实现。对BundleContext#getServiceReference()的第二个参数使用LDAP过滤器,或者调用BundleContext#getServiceReferences()方法,该方法将返回数组或使用相同的代码并依赖于ServiceRanking。https://stackoverflow.com/questions/40734251
复制相似问题