Sie können ein Objekt im JNDI-Standardnamespace (Java™ Naming and Directory Interface) verfügbar machen. Dazu
müssen Sie das Objekt in der OSGi-Service-Registry mit der Serviceeigenschaft
osgi.jndi.service.name registrieren. Der Wert von osgi.jndi.service.name ist der erforderliche JNDI-Name.
Wenn Sie ein Objekt im JNDI-Standardnamespace finden möchten, können Sie die OSGi-Service-Registry mithilfe der Eigenschaft osgi.jndi.service.name suchen. Der Wert
für osgi.jndi.service.name ist der JNDI-Name.
Informationen zu diesem Vorgang
Verglichen mit dem expliziten Aufruf von
Context.bind oder
Context.lookup hat die Service-Registry die folgenden Vorteile:
- Ihr Feature funktioniert ordnungsgemäß, wenn jndi-1.0 aktiviert ist, aber Ihr Feature benötigt keine explizite JNDI-Abhängigkeit.
- Sie müssen die Bindung von Objekten nicht explizit in JNDI aufheben, wenn Ihr Feature entfernt wird, da das OSGi-Framework die Registrierung von Services automatisch aufhebt, wenn Bundles gestoppt werden.
- Sie können Initialisierung bei Bedarf einfach mit den deklarativen Services oder mit ServiceFactory implementieren statt Reference und ObjectFactory zu verwenden.
Weitere Informationen zu JNDI finden Sie unter
Benennung.
Vorgehensweise
- Registrieren Sie einen Service, indem Sie die Eigenschaft osgi.jndi.service.name mit dem JNDI-Namen verwenden. Weitere Informationen zur Registrierung von Services finden Sie unter OSGi-Services registrieren.
- Aktualisieren Sie Ihre Datei metatype.xml so, dass ein JNDI-Name in der Serverkonfiguration angegeben werden kann. Wenn Sie Benutzern erlauben möchten, einen JNDI-Namen für Ihren Service anzugeben, sollten Sie jndiName
id aus Konsistenzgründen mit anderen Featrues in der Liberty Profile-Laufzeit verwenden. Beispiel:
<AD id="jndiName" name="JNDI name" description="JNDI name for a widget." type="String" ibm:unique="jndiName"/>
Sie können ein internes Attribut verwenden, um die Serviceeigenschaft osgi.jndi.service.name auf den Wert des Attributs jndiName zu setzen. Beispiel:
<AD id="osgi.jndi.service.name" name="internal" description="internal" type="String" default="${jndiName}"/>
Weitere Informationen zu OSGi-Metatypen finden Sie unter Erweiterte Konfiguration.
Implementieren Sie die Schnittstelle ResourceFactory, wenn Sie Java EE-Ressourcenreferenzinformationen benötigen. Wenn Sie für Ihren Service Java EE-Ressourcenreferenzen, wie z. B. res-auth, benötigen, können Sie in der OSGi-Service-Registry einen ResourceFactory-Service mit den Eigenschaften jndiName und creates.objectClass registrieren. Der ResourceFactory-Service wird automatisch erneut mit der Eigenschaft
osgi.jndi.service.name registriert. Beispiel:
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);
Alternativ können Sie den Service auch automatisch mithilfe von deklarativen Services und Metatypen registrieren. In diesem Fall können
Sie die Eigenschaft creates.objectClass als deklarative Serviceeigenschaft angeben. Sie müssen die Eigenschaft jndiName nicht angeben, da sie autoamtisch aus der Benutzerkonfiguration mit dem Element <AD
id="jndiName"> in der Datei metatype.xml in
Schritt 2 gesetzt wird. Sie benötigen auch kein Element <AD id="osgi.jndi.service.name> in der Datei metatype.xml, da der ResourceFactory-Service automatisch erneut registriert wird.
- Lokalisieren Sie ein Objekt, indem Sie die Eigenschaft osgi.jndi.service.name mit dem JNDI-Namen verwenden. Beispiel:
bundleContext.getServiceReference(DataSource.class, "(osgi.jndi.service.name=jdbc/myds)");
Alternativ können Sie ResourceFactory mit den Eigenschaften jndiName und creates.objectClass lokalisieren.
- Aktualisieren Sie die Datei metatype.xml so, dass eine Ressource in der Datei server.xml mit der ID der Ressource angegeben werden kann. Auf diese Weise kann auf die Ressource zugegriffen werden, unabhängig davon, ob die Ressource eine Eigenschaft jndiName hat oder nicht. Beispiel:
<AD id="dataSourceRef" type="String" ibm:type="pid" ibm:reference="com.ibm.ws.jdbc.dataSource" cardinality="1" name="%dataSourceRef" description="%dataSourceRef.desc"/>
Wenn Sie deklarative Services verwenden, können Sie ein internes Attribut verwenden, um eine Serviceeigenschaft .target mit einem Filter zu definieren. Wenn Ihre Komponente mit den deklarativen Services beispielsweise eine Referenz mit dem Namen dataSource hat, können Sie die folgende Attributdefinition verwenden, um sicherzustellen, dass "dataSource" von dem verwendeten dataSourceRef-Konfigurationsattribut referenziert wird.
<AD id="dataSource.target" type="String" default="(service.pid=${dataSourceRef})" ibm:final="true" name="internal" description="internal"/>