您可使对象在缺省 Java™ 命名和目录接口
(JNDI) 名称空间中可用。要执行此操作,必须使用 osgi.jndi.service.name 服务属性在 OSGi 服务注册表中注册此对象。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"/>
您可使用内部属性通过 jndiName 属性的值自动设置 osgi.jndi.service.name 服务属性,例如:
<AD id="osgi.jndi.service.name" name="internal" description="internal" type="String" default="${jndiName}"/>
有关 OSGi 元类型的更多信息,请参阅高级配置。
如果需要 Java EE 资源引用信息,请实现 ResourceFactory 接口。 如果服务需要 Java EE 资源引用信息,例如,res-auth,可使用 jndiName 和 creates.objectClass 属性在 OSGi 服务注册表中注册 ResourceFactory。ResourceFactory 服务会自动通过 osgi.jndi.service.name 属性重新注册。 例如: 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 配置属性引用的数据源。
<AD id="dataSource.target" type="String" default="(service.pid=${dataSourceRef})" ibm:final="true" name="internal" description="internal"/>