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

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

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



时间戳记图标 最近一次更新时间: Monday, 5 December 2016
http://www14.software.ibm.com/webapp/wsbroker/redirect?version=cord&product=was-libcore-mp&topic=twlp_feature_jndi
文件名:twlp_feature_jndi.html