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:
Dann haben wir folgende Implementierung:
Anschließend implementieren wir unseren Bundle-Activator wie folgt:
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:
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:
Gruß Tom
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