Thomas Darimont
Erfahrenes Mitglied
Hallo,
hier mal ein Beispiel für den EventAdmin Service unter Equinox OSGi.
Normalerweise verwendet man diesen Dienst um Events über Bundlegrenzen hinweg / zwischen Bundles auszutauschen. In diesem Beispiel ist mein Bundle der Einfachheit halber Sender und Empfänger gleichzeitig.
Ausgabe:
Mittlerweile gibts für equinox eine ganze Reihe von Referenzimplementierungen von Diensten der OSGi Spezifikation siehe:
http://www.eclipse.org/equinox/bundles
Downloaden kann man das ganze via:
http://download.eclipse.org/eclipse/equinox/
http://download.eclipse.org/eclipse/equinox/drops/S-3.5M1-200808071402/index.php
Gruß Tom
hier mal ein Beispiel für den EventAdmin Service unter Equinox OSGi.
Normalerweise verwendet man diesen Dienst um Events über Bundlegrenzen hinweg / zwischen Bundles auszutauschen. In diesem Beispiel ist mein Bundle der Einfachheit halber Sender und Empfänger gleichzeitig.
Java:
package de.tutorials.osgi.events;
import java.util.Dictionary;
import java.util.Hashtable;
import java.util.concurrent.Executors;
import java.util.concurrent.TimeUnit;
import org.osgi.framework.BundleActivator;
import org.osgi.framework.BundleContext;
import org.osgi.framework.ServiceReference;
import org.osgi.service.event.Event;
import org.osgi.service.event.EventAdmin;
import org.osgi.service.event.EventConstants;
import org.osgi.service.event.EventHandler;
public class Activator implements BundleActivator {
/*
* (non-Javadoc)
*
* @see
* org.osgi.framework.BundleActivator#start(org.osgi.framework.BundleContext
* )
*/
public void start(BundleContext context) throws Exception {
ServiceReference eventAdminServiceReference = context
.getServiceReference(EventAdmin.class.getName());
//EventAdmin Service lookup
final EventAdmin eventAdmin = (EventAdmin) context
.getService(eventAdminServiceReference);
//wir sind an Events interessiert die im de/tutorials Namespace (topic) und "darunter" gesendet werden
String[] topics = new String[] { EventConstants.EVENT_TOPIC,
"de/tutorials/*" };
Dictionary<String, Object> ht = new Hashtable<String, Object>();
ht.put(EventConstants.EVENT_TOPIC, topics);
//hier registrieren wir einen entsprechenden EventHandler
context.registerService(EventHandler.class.getName(),
new EventHandler() {
@Override
public void handleEvent(Event event) {
System.out.println("handleEvent: " + event);
try {
TimeUnit.SECONDS.sleep(2L);
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println("finished handleEvent: " + event);
}
}, ht);
Executors.newSingleThreadExecutor().execute(new Runnable() {
@Override
public void run() {
int count = 0;
while (true) {
//hier senden wir 2 Events an unterschiedliche Topics
if (count++ % 5 != 0) {
//postEvent sendet events asynchron -> Methode kehrt sofort zurück
eventAdmin.postEvent(new Event("de/tutorials/BUBU"
+ System.currentTimeMillis(), null));
} else {
//sendEvent sendet events synchron -> Methode wartet bis alle Listener feritg sind.
eventAdmin.sendEvent(new Event("de/tutorials/a/b/c/d/e/XXXX"
+ System.currentTimeMillis(), null));
}
try {
TimeUnit.SECONDS.sleep(1L);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
});
}
/*
* (non-Javadoc)
*
* @see
* org.osgi.framework.BundleActivator#stop(org.osgi.framework.BundleContext)
*/
public void stop(BundleContext context) throws Exception {
}
}
Ausgabe:
Code:
osgi> start de.tutorials.osgi.events
osgi> handleEvent: org.osgi.service.event.Event [topic=de/tutorials/a/b/c/d/e/XXXX1220304000057]
finished handleEvent: org.osgi.service.event.Event [topic=de/tutorials/a/b/c/d/e/XXXX1220304000057]
handleEvent: org.osgi.service.event.Event [topic=de/tutorials/BUBU1220304003058]
finished handleEvent: org.osgi.service.event.Event [topic=de/tutorials/BUBU1220304003058]
handleEvent: org.osgi.service.event.Event [topic=de/tutorials/BUBU1220304004058]
finished handleEvent: org.osgi.service.event.Event [topic=de/tutorials/BUBU1220304004058]
handleEvent: org.osgi.service.event.Event [topic=de/tutorials/a/b/c/d/e/XXXX1220304007058]
handleEvent: org.osgi.service.event.Event [topic=de/tutorials/BUBU1220304005058]
finished handleEvent: org.osgi.service.event.Event [topic=de/tutorials/BUBU1220304005058]
finished handleEvent: org.osgi.service.event.Event [topic=de/tutorials/a/b/c/d/e/XXXX1220304007058]
handleEvent: org.osgi.service.event.Event [topic=de/tutorials/BUBU1220304006058]
finished handleEvent: org.osgi.service.event.Event [topic=de/tutorials/BUBU1220304006058]
handleEvent: org.osgi.service.event.Event [topic=de/tutorials/BUBU1220304010058]
finished handleEvent: org.osgi.service.event.Event [topic=de/tutorials/BUBU1220304010058]
handleEvent: org.osgi.service.event.Event [topic=de/tutorials/BUBU1220304011058]
handleEvent: org.osgi.service.event.Event [topic=de/tutorials/a/b/c/d/e/XXXX1220304014058]
finished handleEvent: org.osgi.service.event.Event [topic=de/tutorials/BUBU1220304011058]
handleEvent: org.osgi.service.event.Event [topic=de/tutorials/BUBU1220304012058]
finished handleEvent: org.osgi.service.event.Event [topic=de/tutorials/a/b/c/d/e/XXXX1220304014058]
finished handleEvent: org.osgi.service.event.Event [topic=de/tutorials/BUBU1220304012058]
handleEvent: org.osgi.service.event.Event [topic=de/tutorials/BUBU1220304013058]
finished handleEvent: org.osgi.service.event.Event [topic=de/tutorials/BUBU1220304013058]
handleEvent: org.osgi.service.event.Event [topic=de/tutorials/BUBU1220304017058]
finished handleEvent: org.osgi.service.event.Event [topic=de/tutorials/BUBU1220304017058]
handleEvent: org.osgi.service.event.Event [topic=de/tutorials/BUBU1220304018058]
handleEvent: org.osgi.service.event.Event [topic=de/tutorials/a/b/c/d/e/XXXX1220304021058]
finished handleEvent: org.osgi.service.event.Event [topic=de/tutorials/a/b/c/d/e/XXXX1220304021058]
finished handleEvent: org.osgi.service.event.Event [topic=de/tutorials/BUBU1220304018058]
handleEvent: org.osgi.service.event.Event [topic=de/tutorials/BUBU1220304019058]
Mittlerweile gibts für equinox eine ganze Reihe von Referenzimplementierungen von Diensten der OSGi Spezifikation siehe:
http://www.eclipse.org/equinox/bundles
Downloaden kann man das ganze via:
http://download.eclipse.org/eclipse/equinox/
http://download.eclipse.org/eclipse/equinox/drops/S-3.5M1-200808071402/index.php
Gruß Tom