OSGi-Services registrieren

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.

Vorgehensweise

  1. 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
    {
    }
  2. 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() {
    
        }
    }
  3. 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();
        }
    
    }
  4. 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 );
            }
        }
    }

Symbol das den Typ des Artikels anzeigt. Taskartikel



Symbol für Zeitmarke Letzte Aktualisierung: 01.12.2016
http://www14.software.ibm.com/webapp/wsbroker/redirect?version=cord&product=was-nd-mp&topic=twlp_feat_service_pojo
Dateiname: twlp_feat_service_pojo.html