© DrHitch/Shutterstock.com
Modulare Software entwickeln mit OSGi

4 Coordinator-Spezifikation


Transaktionen bilden in der Softwareentwicklung ein elementares Glied. Auch OSGi benötigt koordinierte Abläufe, um verschiedene Aktivitäten und ihre Auswirkungen synchronisieren zu können. Im vierten und letzten Kapitel dieses shortcuts schauen wir uns die Coordinator-Spezifikation genauer an.

Die Coordinator Service Specification [1] blickt auf eine lange Geschichte in OSGi zurück. Eine sehr schön beschriebene Zusammenfassung von Peter Kriens findet sich unter [2]. Es handelt sich dabei um eine Spezifikation, die sehr mächtig und gleichzeitig einfach zu handhaben ist. Auf Basis des OSGi-Servicemodells können verschiedene Interessenten an einer Operation teilhaben und werden über das erfolgreiche bzw. fehlerhafte Beenden der Operation informiert. Dies ermöglicht ganz neue Möglichkeiten in Bezug auf OSGi und OSGi Services in der Verarbeitung von Daten. Verschiedene OSGi Services können zusammenarbeiten und Operationen erst im Falle von Erfolg abschließen. Dies ähnelt sehr einer XA-Transaktion, ist jedoch wesentlich leichtgewichtiger. Dennoch bestehen zwischen XA-Transaktionen und der Coordinator Specification grundlegende Unterschiede.

Konzepte

Die Coordinator Specification definiert vier Konzepte:

  • Initiator
  • Coordinator
  • Coordination
  • Participants

Der Coordinator ist ein OSGi Service, der vom Initiator verwendet wird, um neue Coordinations zu erzeugen. Eine Coordination stellt eine Abstraktion für die Koordination einer Operation dar. Um auf Events einer Coordination reagieren zu können – das bedeutet auf das erfolgreiche bzw. fehlerhafte Beenden – werden so genannte Participants verwendet. Dabei gilt, dass die Verteilung von Events atomar ist. Participants können zudem im Kontext der Coordination Daten sammeln und Operationen erst bei erfolgreichem Beenden der Coordination verarbeiten, beispielsweise das Schreiben von Daten in eine Datenbank. Ein „Persistence-Service“ kann die zu schreibenden Sätze sammeln und erst bei Beendigung der Coordination schreiben. Der Initiator ist dafür verantwortlich, dass Coordinations erzeugt werden. Listing 4.1 zeigt ein Beispiel.

public class Example implements Participant{

Coordinator cordinator; // OSGi service

public void run(){
Coordination c = cordinator.create("org.example", 0);
try{
c.addParticipant(this);
doWork();
}catch(Exception e){
c.fail(e);
}finally {
c.end();
}
}

private void doWork() {
// do work here
}

public void ended(Coordination coordination) throws Exception {
// coordination ended properly
}

public...

Neugierig geworden? Wir haben diese Angebote für dich:

Angebote für Teams

Für Firmen haben wir individuelle Teamlizenzen. Wir erstellen Ihnen gerne ein passendes Angebot.

Das Library-Modell:
IP-Zugang

Das Company-Modell:
Domain-Zugang