Sie können ein Objekt erstellen und als OSGi-Service registrieren, damit Features anderer Anbieter dieses verwenden können.
Informationen zu diesem Vorgang
Sie können ein Objekt mit einfachem Java-Code erstellen und das Objekt dann mit der Klasse BundleContext als Service registrieren.
Da der Code ausgeführt werden muss, registrieren Sie das Objekt normalerweise in einer BundleActivator-Schnittstelle.
Bei der Objektregistrierung können Sie angeben, welche Schnittstellen das Objekt bereitstellt. Es wird ein ServiceRegistration-Objekt
zurückgegeben. Bei Bedarf können Sie das ServiceRegistration-Objekt verwenden,
um die Eigenschaften zu ändern. Wenn der Service beendet wird,
können Sie das ServiceRegistration-Objekt verwenden, um die
Registrierung des Service aufzuheben.
Um einen Service anzufordern, fragen Sie die BundleContext-Schnittstelle nach einem Service ab, der eine erforderliche Schnittstelle und (optional) einen LDAP-Syntaxfilter entsprechend der Serviceeigenschaften bereitstellt. Je nach
aufgerufener Methode, können Sie die passendste Übereinstimmung oder alle Übereinstimmungen abrufen.
Sie können das zurückgegebene ServiceReference-Objekt,
das die Eigenschaften bereitstellt, für weitere Zuordnungen in Ihrem Code verwenden. Sie können
das ServiceReference-Objekt verwenden, um das eigenliche Serviceobjekt abzurufen. Wenn Sie die Verwendung des Service beendet haben, können Sie BundleContext-Schnittstelle verwenden,
um den Service wieder freizugeben.
- Deklarieren Sie die Serviceschnittstelle durch das Hinzufügen des folgenden Codes in Ihrem Bundle.
package com.ibm.foo.simple;
/**
* Eine multifunktionale Beispielschnittstelle
*/
public interface Foo
{
}
- Geben Sie den Implementierungscode der Schnittstelle an.
package com.ibm.foo.simple;
/**
* Implementierung der Foo-Schnittstelle
*/
public class FooImpl implements Foo
{
public FooImpl()
{
}
public FooImpl(String vendor)
{
}
/**
* Verwendung durch die ServiceFactory-Implementierung
*/
public void destroy() {
}
}
- Verwenden Sie die BundleContext-Schnittstelle, um den Service zu registrieren,
die Serviceeigenschaften zu ändern und die Registrierung des Service
direkt in Ihrem Code aufzuheben.
import java.util.Dictionary;
import org.osgi.framework.BundleContext;
import org.osgi.framework.ServiceRegistration;
/**
* Registriert einen Foo-Service direkt
* und zeigt, wie die Serviceeigenschaften im Code geändert werden können.
*/
public class FooController
{
private final BundleContext bundleContext;
private ServiceRegistration<Foo> sr;
public FooController( BundleContext bundleContext )
{
this.bundleContext = bundleContext;
}
public void register(Dictionary<String, Object> serviceProperties) {
Foo foo = new FooImpl();
//typisierte Serviceregistrierung mit einer Schnittstelle
sr = bundleContext.registerService( Foo.class, foo, serviceProperties );
//oder
//nicht typisierte Serviceregistrierung mit einer Schnittstelle
sr = (ServiceRegistration<Foo>)bundleContext.registerService(
Foo.class.getName(), foo, serviceProperties );
//oder
//nicht typisierte Serviceregistsrierung mit mehr als einer Schnittstelle (oder Klasse)
sr = (ServiceRegistration<Foo>)bundleContext.registerService(new String[] {
Foo.class.getName(), FooImpl.class.getName()}, foo, serviceProperties );
}
public void modifyFoo(Dictionary<String, Object> serviceProperties) {
//nach der Serviceregistrierung können Sie die Serviceeigenschaften jederzeit ändern
sr.setProperties( serviceProperties );
}
public void unregisterFoo() {
//Heben Sie die Registrierung in der Serviceregistrierung auf, wenn Sie den Service nicht mehr benötigen.
sr.unregister();
}
}
- Rufen Sie den Service aus einer anderen Klasse an, und geben Sie ihn wieder zurück:
package com.ibm.foo.simple;
import java.util.Collection;
import org.osgi.framework.BundleContext;
import org.osgi.framework.InvalidSyntaxException;
import org.osgi.framework.ServiceReference;
/**
* Ein einfacher Foo-Client, der den Foo-Service anfordert und ihn wieder zurückgibt, wenn er nicht mehr benötigt wird.
*/
public class FooUser
{
private final BundleContext bundleContext;
public FooUser( BundleContext bundleContext )
{
this.bundleContext = bundleContext;
}
/**
* Es wird vorausgesetzt, dass es nur einen "Foo"-Service gibt.
*/
public void useFooSimple() {
ServiceReference<Foo> sr = bundleContext.getServiceReference( Foo.class );
String[] propertyKeys = sr.getPropertyKeys();
for (String key: propertyKeys) {
Object prop = sr.getProperty( key );
//Überprüfung, ob dies der geforderte "Foo"-Client ist.
}
Foo foo = bundleContext.getService( sr );
try {
//Verwendung von "Foo"
} finally {
//Ende
bundleContext.ungetService( sr );
}
}
/**
* Verwenden Sie einen Filter um einen bestimmten "Foo"-Service auszuwählen. Wenn mehrere "Foo"-Services zurückgegeben werden, muss einer ausgewählt werden.
* @throws InvalidSyntaxException
*/
public void useFooFilter() throws InvalidSyntaxException {
Collection<ServiceReference<Foo>> srs = bundleContext.getServiceReferences(
Foo.class, "(&(service.vendor=IBM)(id='myFoo')" );
ServiceReference<Foo> sr = srs.iterator().next();
String[] propertyKeys = sr.getPropertyKeys();
for (String key: propertyKeys) {
Object prop = sr.getProperty( key );
//Überprüfung, ob dies der geforderte "Foo"-Client ist.
}
Foo foo = bundleContext.getService( sr );
try {
//Verwendung von "Foo"
} finally {
//Ende
bundleContext.ungetService( sr );
}
}
}