在 Liberty 功能部件中使用 JNDI 缺省名称空间开发

您可使对象在缺省 Java™ 命名和目录接口 (JNDI) 名称空间中可用。要执行此操作,必须使用 osgi.jndi.service.name 服务属性在 OSGi 服务注册表中注册此对象。osgi.jndi.service.name 的值为必需 JNDI 名称。相似地,要在缺省 JNDI 名称空间中找到对象,可使用 osgi.jndi.service.name 服务属性搜索 OSGi 服务注册表。osgi.jndi.service.name 的值为 JNDI 名称。

关于此任务

相比显式调用 Context.bindContext.lookup,使用服务注册表具有以下优势:
  • 您的功能部件在启用 jndi-1.0 时运行正常,但功能部件不需要对 JNDI 的显式依赖关系。
  • 移除了功能部件时,不需要从 JNDI 显式取消绑定对象,因为停止捆绑软件时 OSGi 框架会自动取消注册服务。
  • 您可使用声明式服务或 ServiceFactory 而不是 ReferenceObjectFactory 来轻松实现延迟初始化。

有关 JNDI 的更多信息,请参阅命名

过程

  1. 使用 osgi.jndi.service.name 属性向 JNDI 名称注册服务。 有关注册服务的更多信息,请参阅注册 OSGi 服务
  2. 更新 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 元类型的更多信息,请参阅高级配置
  3. [8.5.5.1 或更高版本]如果需要 Java EE 资源引用信息,请实现 ResourceFactory 接口。 如果服务需要 Java EE 资源引用信息,例如,res-auth,可使用 jndiNamecreates.objectClass 属性在 OSGi 服务注册表中注册 ResourceFactoryResourceFactory 服务会自动通过 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 服务。
  4. 使用 osgi.jndi.service.name 属性找到具有 JNDI 名称的对象。 例如:
    bundleContext.getServiceReference(DataSource.class, "(osgi.jndi.service.name=jdbc/myds)");
    或者,可使用 jndiNamecreates.objectClass 属性找到 ResourceFactory
  5. 更新 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"/>

用于指示主题类型的图标 任务主题

信息中心的条款和条件 | 反馈


时间戳记图标 最近一次更新时间: Wednesday, 2 September 2015
http://www14.software.ibm.com/webapp/wsbroker/redirect?version=phil&product=was-libcore-mp&topic=twlp_feature_jndi
文件名:twlp_feature_jndi.html