Développement avec l'espace de nom JNDI par défaut dans une fonction Liberty

Vous pouvez rendre un objet disponible dans l'espace de nom par défaut Java™ Naming and Directory Interface (JNDI). Pour ce faire, vous devez l'enregistrer dans le registre de service OSGi avec la propriété de service osgi.jndi.service.name. La valeur de osgi.jndi.service.name est le nom JNDI requis. De même, pour rechercher un objet dans l'espace de nom JNDI par défaut, vous pouvez parcourir le registre de service OSGi avec la propriété de service osgi.jndi.service.name. La valeur de osgi.jndi.service.name est le nom JNDI.

Pourquoi et quand exécuter cette tâche

Comparée avec l'appel explicite de Context.bind ou Context.lookup, l'utilisation du registre de service a les avantages suivants :
  • Votre fonction fonctionne correctement lorsque jndi-1.0 est activé, mais elle n'a pas besoin d'une dépendance explicite sur JNDI.
  • Vous n'avez pas besoin de déconnecter explicitement les objets de JNDI lorsque votre fonction est supprimée car l'infrastructure OSGi désenregistre automatiquement les services à l'arrêt des bundles.
  • Vous pouvez aisément implémenter l'initialisation en retard à l'aide des services déclaratifs ou de ServiceFactory plutôt qu'utiliser Reference et ObjectFactory.

Pour plus d'informations sur JNDI, voir Naming.

Procédure

  1. Enregistrez un service à l'aide de la propriété osgi.jndi.service.name avec le nom JNDI. Pour plus d'informations sur l'enregistrement des services, voir Enregistrement des services OSGi.
  2. Mettez à jour votre fichier metatype.xml pour permettre la spécification d'un nom JNDI dans la configuration du serveur. Pour permettre aux utilisateurs de spécifier un nom JNDI pour votre service, utilisez jndiName id pour la cohérence avec les autres fonctions dans la phase d'exécution de Liberty, par exemple :
    <AD id="jndiName" name="JNDI name" description="JNDI name for a widget." type="String" ibm:unique="jndiName"/>
    Vous pouvez utiliser un attribut interne pour définir automatiquement la propriété de service osgi.jndi.service.name avec la valeur de l'attribut jndiName, par exemple :
    <AD id="osgi.jndi.service.name" name="internal" description="internal" type="String" default="${jndiName}"/>
    Pour plus d'informations sur le métatype, voir Configuration avancée.
  3. Implémentez l'interface ResourceFactory si vous avez besoin d'informations de référence de ressource Java EE. Si votre service a besoin d'informations de référence de ressource Java EE, comme res-auth, vous pouvez enregistrer une valeur ResourceFactory dans le registre de service OSGi avec les propriétés jndiName et creates.objectClass. Le service ResourceFactory est ré-enregistré automatiquement avec la propriété osgi.jndi.service.name. Par exemple :
        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);
    Alternatively, the service could be registered automatically using declarative services and metatype. In that case, you can specify the creates.objectClass property as a declarative services property. You do not need to specify the jndiName property because it is set automatically from the user configuration with the <AD id="jndiName"> element in the metatype.xml file in step 2, and you do not need an <AD id="osgi.jndi.service.name> element in the metatype.xml file because the ResourceFactory service will be re-registered automatically.
  4. Locate an object using the osgi.jndi.service.name property with the JNDI name. For example:
    bundleContext.getServiceReference(DataSource.class, "(osgi.jndi.service.name=jdbc/myds)");
    Alternatively, you can locate a ResourceFactory using the jndiName and creates.objectClass properties.
  5. Update your metatype.xml to allow a resource to be specified in server.xml using the id of the resource. This allows the resource to be accessed regardless of whether or not the resource has a jndiName. For example,
    <AD id="dataSourceRef" type="String" ibm:type="pid" ibm:reference="com.ibm.ws.jdbc.dataSource"
     cardinality="1" name="%dataSourceRef" description="%dataSourceRef.desc"/>
    If you are using declarative services, you can use an internal attribute to set a .target service property with a filter. For example, if your declarative services component has a reference named dataSource, you can use the following attribute definition to ensure that the dataSource that is referenced by the dataSourceRef configuration attribute is used.
    <AD id="dataSource.target" type="String" default="(service.pid=${dataSourceRef})" ibm:final="true" name="internal" description="internal"/>

Icône indiquant le type de rubrique Rubrique Tâche

Nom du fichier : twlp_feature_jndi.html