【发布时间】:2016-11-22 05:16:30
【问题描述】:
我正在考虑编写 OSGI 包并将其公开为 OSGI 服务。现在,我想从另一个 java 模块调用这个 OSGI 服务,假设 OSGI 包和 java 模块都运行在同一个 JVM 中。
是否可以从 OSGI 外部调用 OSGI 公开服务?
提前致谢!
【问题讨论】:
-
您能否更准确地描述您所说的“另一个 java 模块”的性质?这是什么?
标签: osgi-bundle
我正在考虑编写 OSGI 包并将其公开为 OSGI 服务。现在,我想从另一个 java 模块调用这个 OSGI 服务,假设 OSGI 包和 java 模块都运行在同一个 JVM 中。
是否可以从 OSGI 外部调用 OSGI 公开服务?
提前致谢!
【问题讨论】:
标签: osgi-bundle
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);
}
MyService 在您的类路径中不可用。这不是问题,因为您可以将部署到 OSGi 容器的任何类用于 FrameworkUtil.getBundle() 方法,并且可以将字符串 (FQCN) 传递给 BundleContext#getServiceReference() 方法。MyService 有多种实现方式。对BundleContext#getServiceReference() 的第二个参数使用LDAP 过滤器或调用BundleContext#getServiceReferences() 方法,该方法将返回一个数组或使用相同的代码并依赖ServiceRanking。【讨论】:
getBundle() 这样的 NPE 可以返回 null,否则没问题。