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
- 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, 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.
- 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.
- 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.
- 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"/>