您可以使对象在缺省 Java™ 命名和目录接口 (JNDI) 名称空间中可用。为此,您必须在 OSGi 服务注册表中使用 osgi.jndi.service.name 服务属性注册该对象。osgi.jndi.service.name 的值是必需的 JNDI 名称。同样,要在缺省 JNDI 名称空间中查找对象,可以使用 osgi.jndi.service.name 服务属性来搜索 OSGi 服务注册表。osgi.jndi.service.name 的值为 JNDI 名称。
关于此任务
与显式调用
Context.bind 或
Context.lookup 相比,使用服务注册表具有下列优势:
- 启用了 jndi-1.0 时,您的功能部件将正常工作,但是您的功能部件不需要显式依赖 JNDI。
- 移除了您的功能部件时,您不需要显式解除对象与 JNDI 的绑定,因为当捆绑软件停止时,OSGi 框架会自动注销服务。
- 您可以使用声明式服务或 ServiceFactory(而不使用 Reference 和 ObjectFactory)来轻松实现延迟初始化。
有关 JNDI 的更多信息,请参阅命名。
过程
- 使用 osgi.jndi.service.name 属性和 JNDI 名称来注册服务。 有关注册服务的更多信息,请参阅注册 OSGi 服务。
- 更新 metatype.xml 以允许在服务器配置中指定 JNDI 名称。 要允许用户为服务指定 JNDI 名称,请使用 jndiName id,以与 Liberty 运行时中的其他功能部件保持一致,例如:
<AD id="jndiName" name="JNDI name" description="JNDI name for a widget." type="String" ibm:unique="jndiName"/>
可以使用内部属性为 osgi.jndi.service.name 服务属性自动设置 jndiName 属性的值,例如:
<AD id="osgi.jndi.service.name" name="internal" description="internal" type="String" default="${jndiName}"/>
有关 OSGi 元类型的更多信息,请参阅高级配置。
- 如果您需要 Java EE 资源引用信息,请实现 ResourceFactory 接口。 如果服务需要 Java EE 资源引用信息(例如,res-auth),那么您可以在 OSGi 服务注册表中使用 jndiName 和 creates.objectClass 属性来注册 ResourceFactory。会使用 osgi.jndi.service.name 属性来自动重新注册 ResourceFactory 服务。 例如:
import com.ibm.wsspi.resource.ResourceFactory;
public class WidgetResourceFactory implements ResourceFactory { ... }
Properties properties = new Properties();
properties.put(ResourceFactory.JNDI_NAME, "widget/abc");
properties.put(ResourceFactory.CREATES_OBJECT_CLASS, Widget.class.getName());
bundleContext.registerService(ResourceFactory.class, new WidgetResourceFactory(), properties);
此外,可以使用声明式服务和元类型来自动注册服务。在这种情况下,您可以指定 creates.objectClass 属性作为声明式服务属性。不需要指定 jndiName 属性,因为在步骤 2 中在 metatype.xml 文件中具有 <AD id="jndiName"> 元素的用户配置中自动设置了此属性,不需要 metatype.xml 文件中的 <AD id="osgi.jndi.service.name> 元素,因为会自动重新注册 ResourceFactory 服务。
- 使用 osgi.jndi.service.name 属性和 JNDI 名称来查找对象。 例如:
bundleContext.getServiceReference(DataSource.class, "(osgi.jndi.service.name=jdbc/myds)");
此外,您可以使用 jndiName 和 creates.objectClass 属性来查找 ResourceFactory。
- 更新 metatype.xml 以允许在 server.xml 中使用资源标识来指定资源。无论该资源是否具有 jndiName,都允许访问该资源。 例如,
<AD id="dataSourceRef" type="String" ibm:type="pid" ibm:reference="com.ibm.ws.jdbc.dataSource"
cardinality="1" name="%dataSourceRef" description="%dataSourceRef.desc"/>
如果正使用声明式服务,那么可使用内部属性来对过滤器设置 .target 服务属性。例如,如果您的声明式服务组件具有名为 dataSource 的引用,那么可以使用以下属性定义来确保使用 dataSourceRef 配置属性所引用的 dataSource。
<AD id="dataSource.target" type="String" default="(service.pid=${dataSourceRef})" ibm:final="true" name="internal" description="internal"/>