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
Nommage.
Procédure
- 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.
- 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, vous devez utiliser jndiName
id pour la cohérence avec les autres fonctions dans
l'exécution du profil Liberty, par exemple :
<AD id="jndiName" name="Nom JNDI" description="Nom
JNDI pour un 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.
Implémentez l'interface ResourceFactory si vous
avez besoin d'informations de référence de ressource Java EE. Sivotre sevrice 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. 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);
Sinon, le service peut être enregistré automatiquement à l'aide
des services déclaratifs et du métatype. Dans ce cas, vous pouvez
spécifier la propriété creates.objectClass en
propriété de services déclaratifs. Vous n'avez pas besoin de
spécifier la propriété jndiName car elle est
automatiquement définie à partir de la configuration utilisateur avec
l'élément <AD
id="jndiName"> dans le
fichier metatype.xml à l'étape
2,
et vous n'avez pas besoin d'élément
<AD
id="osgi.jndi.service.name>
dans le fichier metatype.xml car le service
ResourceFactory sera automatiquement ré-enregistré.
- Localisez un objet à l'aide de la propriété
osgi.jndi.service.name avec le nom
JNDI. Exemple :
bundleContext.getServiceReference(DataSource.class, "(osgi.jndi.service.name=jdbc/myds)");
Sinon, vous pouvez localiser
une valeur ResourceFactory à l'aide des propriétés
jndiName et creates.objectClass.
- Mettez à jour votre fichier
metatype.xml pour permettre à une ressource
d'être spécifiée dans le fichier server.xml à
l'aide de l'ID de la ressource. Ceci permet à la ressource d'être
accessible que la ressource ait un jndiName ou non. Par exemple,
<AD id="dataSourceRef" type="String" ibm:type="pid" ibm:reference="com.ibm.ws.jdbc.dataSource" cardinality="1" name="%dataSourceRef" description="%dataSourceRef.desc"/>
Si vous utilisez des services déclaratifs, vous pouvez utiliser un
attribut interne pour définir une propriété
de service .target avec un filtre.
Par exemple, si votre composant de services déclaratifs a une
référence appelée dataSource, vous pouvez utiliser
la définition d'attribut suivante pour vous assurer que la dataSource
référencée par l'attribut de configuration dataSourceRef est
utilisée.
<AD id="dataSource.target" type="String" default="(service.pid=${dataSourceRef})" ibm:final="true" name="internal" description="internal"/>