Puede hacer que un objeto esté disponible en el espacio de nombres JNDI (Java™ Naming and Directory Interface) predeterminado. Para ello, debe registrarlo en el registro de servicios OSGi con la propiedad de servicio osgi.jndi.service.name. El valor de osgi.jndi.service.name es el nombre JNDI necesario. De forma similar, para buscar un objeto en el espacio de nombres JNDI predeterminado, puede buscar en el registro de servicios OSGi con la propiedad de servicio osgi.jndi.service.name. El valor de osgi.jndi.service.name es el nombre JNDI.
Acerca de esta tarea
En comparación con una llamada
Context.bind o
Context.lookup explícitamente, la utilización del registro de servicio tiene ofrece las siguientes ventajas:
- Su característica funciona correctamente cuando se ha habilitado jndi-1.0 pero su característica no necesita una dependencia explícita con JNDI.
- No es necesario desenlazar objetos de forma explícita desde JNDI cuando se elimina la característica porque la infraestructura de
OSGi automáticamente anulará el registro de servicios cuando se detengan los paquetes.
- Puede implementar fácilmente la inicialización poco activa utilizando servicios declarativos o ServiceFactory en lugar de utilizar Reference y ObjectFactory.
Para obtener más información sobre JNDI, consulte Naming.
Procedimiento
- Registre un servicio utilizando la propiedad osgi.jndi.service.name con el nombre JNDI. Para obtener más información sobre el registro de servicios, consulte Registro de servicios OSGi.
- Actualice el archivo metatype.xml para permitir especificar un nombre JNDI en la configuración del servidor. Para permitir que los usuarios especifiquen un nombre JNDI para su servicio, debería utilizar jndiName
id para que haya coherencia con otras características en el tiempo de ejecución de perfiles Liberty, por ejemplo:
<AD id="jndiName" name="JNDI name" description="JNDI name for a widget." type="String" ibm:unique="jndiName"/>
Puede utilizar un atributo interno para establecer automáticamente la propiedad de servicio osgi.jndi.service.name con el valor del atributo
jndiName, por ejemplo:
<AD id="osgi.jndi.service.name" name="internal" description="internal" type="String" default="${jndiName}"/>
Para obtener más información sobre los metatipos de OSGi, consulte Configuración avanzada.
Implemente la interfaz ResourceFactory si necesita información de referencia de recursos
Java EE. Si su servicio necesita información de referencia de recursos Java EE como, por ejemplo, res-auth, puede registrar un valor
ResourceFactory en el registro de servicios de OSGi con las propiedades jndiName y creates.objectClass. El servicio ResourceFactory se vuelve a registrar automáticamente con la propiedad osgi.jndi.service.name. Por
ejemplo: 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);
De forma alternativa, el servicio se puede registrar automáticamente utilizando servicios declarativos y metatipos. En tal caso, puede especificar la propiedad
creates.objectClass como propiedad de servicios declarativos. No es necesario que especifique la propiedad jndiName porque se ha establecido automáticamente a partir de la configuración del usuario con el elemento <AD
id="jndiName"> en el archivo metatype.xml en el paso 2, y no es necesario ningún elemento <AD id="osgi.jndi.service.name> en el archivo metatype.xml porque el servicio ResourceFactory se volverá a registrar automáticamente.
- Localice un objeto utilizando la propiedad osgi.jndi.service.name con el nombre JNDI. Por
ejemplo:
bundleContext.getServiceReference(DataSource.class, "(osgi.jndi.service.name=jdbc/myds)");
De forma alternativa, puede localizar un valor ResourceFactory utilizando las propiedades
jndiName y creates.objectClass.
- Actualice su archivo metatype.xml para permitir especificar un recurso en server.xml utilizando el ID del recurso. De este modo se permite acceder al recurso independientemente de si el recurso tiene o no el valor jndiName. Por ejemplo:
<AD id="dataSourceRef" type="String" ibm:type="pid" ibm:reference="com.ibm.ws.jdbc.dataSource" cardinality="1" name="%dataSourceRef" description="%dataSourceRef.desc"/>
Si está utilizando servicios declarativos, puede utilizar un atributo interno para definir una propiedad de servicio .target con un filtro. Por ejemplo, si su componente de servicios declarativos tiene una referencia denominada
dataSource, puede utilizar la definición de atributo siguiente para garantizar que se utiliza el valor
de dataSource al cual hace referencia el atributo de configuración dataSourceRef.
<AD id="dataSource.target" type="String" default="(service.pid=${dataSourceRef})" ibm:final="true" name="internal" description="internal"/>