查找 OSGi 应用程序
可以使用 org.apache.aries.blueprint 包中的类来扩展 OSGi 应用程序编程模型;此第三方 SPI 是通过 blueprint-1.0 服务器功能部件提供。必须访问 OSGi 应用程序捆绑软件才能应用扩展。在 Liberty 概要文件中,OSGi 应用程序作为子系统来运行。要查找 OSGi 应用程序,您可以在用户功能部件中创建 ServiceTracker。
关于此任务
本主题描述了用户功能部件的开发者如何找到正在运行的 OSGi 应用程序。提供 OSGi 应用程序编程模型扩展的用户功能部件通常需要此任务。例如,新用户功能部件可提供此类扩展,方式是实现新的捆绑软件扩充器(通常称为容器),或者更简单一点,就是跟踪并调用从某些 OSGi 应用程序内部发布的服务。
此类用户功能部件必须使用正在运行的特定 OSGi 应用程序的 BundleContext 来创建新的 BundleTracker 和 ServiceTracker 实例。可以从与 OSGi 应用程序相关联的 org.osgi.service.subsystem.Subsystem 获取此 BundleContext。以下过程描述了如何获取该子系统服务。
过程
要通过在用户功能部件中创建 ServiceTracker 来查找 OSGi 应用程序,请完成下列步骤:
- 构造以要查找的子系统为目标的 org.osgi.framework.Filter。
- 创建 org.osgi.util.tracker.ServiceTracker,它使用步骤 1 中的过滤器来获取与您想要查找的 OSGi 应用程序相关联的 org.osgi.service.subsystem.Subsystem 服务。 此 Subsystem 服务实例提供您处理 OSGi 应用程序所需的一切。
示例
以下示例说明如何使用 ServiceTracker 在用户功能部件中查找符号名称为 my.app 的应用程序:
import org.osgi.framework.BundleContext;
import org.osgi.service.subsystem.Subsystem;
import org.osgi.util.tracker.ServiceTracker;
import org.osgi.util.tracker.ServiceTrackerCustomizer;
在以下代码摘录中,变量 ctx 是其中一个用户功能部件捆绑软件的 BundleContext:
String SERVICE_FILTER = "(&(objectClass=org.osgi.service.subsystem.Subsystem)
(subsystem.type=osgi.subsystem.application)(subsystem.symbolicName=my.app))"
org.osgi.framework.Filter filter = ctx.createFilter(SERVICE_FILTER);
可以将最后的“null”参数替换为用于实现 ServiceTrackerCustomizer<Subsystem,
Subsystem> 的类的实例:
org.osgi.util.tracker.ServiceTracker<Subsystem, Subsystem> str = new ServiceTracker<Subsystem, Subsystem>(ctx, filter, null);
可以构造 SERVICE_FILTER 以利用如下所示的常量:
org.osgi.framework.Constants.OBJECTCLASS;
org.osgi.service.subsystem.SubsystemConstants.SUBSYSTEM_SYMBOLICNAME_PROPERTY;
org.osgi.service.subsystem.SubsystemConstants.SUBSYSTEM_TYPE_APPLICATION;
org.osgi.service.subsystem.SubsystemConstants.SUBSYSTEM_TYPE_PROPERTY;