Beispiel für die Verwendung von OSGi Services auf Basis von Equinox

Thomas Darimont

Erfahrenes Mitglied
Hallo,

hier mal ein kleines Beispiel für die Verwendung von OSGi Services.
Dazu erstellen wir zwei Plugins:
de.tutorials.training.osgi.simple
de.tutorials.training.osgi.extended

Als Plugin-Projekt Typ wählen wir "equinox" aus.

Im Plugin de.tutorials.training.osgi.simple haben wir ein Interface IAggregator:
Java:
/**
 * 
 */
package de.tutorials.training.osgi.simple.services;

/**
 * @author Tom
 *
 */
public interface IAggregatorService {
  int aggregate(int[] values);
}

Dann haben wir folgende Implementierung:
Java:
/**
 * 
 */
package de.tutorials.training.osgi.simple.services.internal;

import de.tutorials.training.osgi.simple.services.IAggregatorService;

/**
 * @author Tom
 *
 */
public class AggregatorService implements IAggregatorService{
  public int aggregate(int[] values) {
    int sum = 0;
    for(int value : values){
      sum += value;
    }
    return sum;
  }
}

Anschließend implementieren wir unseren Bundle-Activator wie folgt:
Java:
package de.tutorials.training.osgi.simple;

import java.util.Hashtable;

import org.osgi.framework.BundleActivator;
import org.osgi.framework.BundleContext;
import org.osgi.util.tracker.ServiceTracker;

import de.tutorials.training.osgi.simple.services.IAggregatorService;
import de.tutorials.training.osgi.simple.services.internal.AggregatorService;

public class Activator implements BundleActivator {

  private IAggregatorService aggregatorService;
  private ServiceTracker aggregatorServiceTracker;


  /*
   * (non-Javadoc)
   * @see org.osgi.framework.BundleActivator#start(org.osgi.framework.BundleContext)
   */
  public void start(BundleContext context) throws Exception {

    String serviceClassName = IAggregatorService.class.getName();
    context.registerService(serviceClassName, new AggregatorService(), new Hashtable());
    aggregatorServiceTracker = new ServiceTracker(context, serviceClassName, null);
    aggregatorServiceTracker.open();
    aggregatorService = (IAggregatorService) aggregatorServiceTracker.getService();
  }


  /*
   * (non-Javadoc)
   * @see org.osgi.framework.BundleActivator#stop(org.osgi.framework.BundleContext)
   */
  public void stop(BundleContext context) throws Exception {
    aggregatorServiceTracker.close();
    aggregatorServiceTracker = null;
    aggregatorService = null;
  }
}

Danach gehen wir ins Plugin Manifest unter Runtime und Exportieren das Package:
package de.tutorials.training.osgi.simple.services

Damit ist das interface IAggregatorService auch für andere verwender dieses Plugins sichtbar.

Nun erzeugen wir ein neues Plugin:
de.tutorials.training.osgi.extended

Dort gehen wir ins Plugin Manifest und geben bei Dependencies unter Required Plug-ins das Plugin:
de.tutorials.training.osgi.simple an.

Anschließend implementieren wir dessen Activator wie folgt:
Java:
package de.tutorials.training.osgi.extended;

import org.osgi.framework.BundleActivator;
import org.osgi.framework.BundleContext;
import org.osgi.framework.ServiceReference;

import de.tutorials.training.osgi.simple.services.IAggregatorService;

public class Activator implements BundleActivator {

  IAggregatorService aggregatorService;
  ServiceReference aggregatorServiceReference;


  /*
   * (non-Javadoc)
   * @see org.osgi.framework.BundleActivator#start(org.osgi.framework.BundleContext)
   */
  public void start(BundleContext context) throws Exception {
    aggregatorServiceReference = context.getServiceReference(IAggregatorService.class.getName());
    if (null != aggregatorServiceReference) {
      aggregatorService = (IAggregatorService) context.getService(aggregatorServiceReference);
    }

    if (null != aggregatorService) {
      System.out.println(aggregatorService.aggregate(new int[] { 1, 2, 3, 4, 5 }));
    }
  }


  /*
   * (non-Javadoc)
   * @see org.osgi.framework.BundleActivator#stop(org.osgi.framework.BundleContext)
   */
  public void stop(BundleContext context) throws Exception {
    if (null != aggregatorServiceReference) {
      context.ungetService(aggregatorServiceReference); 
    }
  }
}

Anschließend selektieren wir das de.tutorials.training.osgi.extended Plugin-Projekt und wählen im
Kontextmenü Run-As Equinox.

Nun bekommen wir die Ausgabe:
Code:
osgi> 15

Gruß Tom
 

Anhänge

  • de.tutorials.training.osgi.simple.zip
    5,5 KB · Aufrufe: 258
  • de.tutorials.training.osgi.extended.zip
    3,4 KB · Aufrufe: 219