• Keine Ergebnisse gefunden

8. Implementierung und interne Abläufe

8.2 Bearbeitung einer Aufgabe

Um das Zusammenspiel der oben beschriebenen Komponenten darzustellen, beobachten wir im folgenden, was mit einer Aufgabe geschieht, nachdem sie von der ConTract Engine an den Benutzeragenten übermittelt wurde und bevor sie - fertig bearbeitet - von diesem wieder zu-rückgeschickt wird:

8.2.1 Eintreffen der Aufgabe

void service (

in APRICOTS_Definitions::ConTractInstanceID ciid,

in APRICOTS_Definitions::StepInstance stepInstance, in APRICOTS_Definitions::EntryInvariant entryInvariant, in Transactions::Control control,

in string request, in APRICOTS_Definitions::FileSequence files) raises(APRICOTS_Definitions::Reject);

ansprechen. Dies kann auch indirekt über einen vorgeschalteten Stub erfolgen. Das Schnitt-stellenobjekt speichert, nachdem es über die erhaltene control die noch benötigten Infor-mationen abgefragt hat, die empfangene Aufgabe durch einen Aufruf von

void setTask(

in SessionId session,

in APRICOTS_Definitions::NameString AgentName, in string taName, in APRICOTS_Definitions::ConTractInstanceID ciid,

in APRICOTS_Definitions::StepInstance stepInstance, in string recoveryCoordinatorString, in APRICOTS_Definitions::FileSequence files)

raises (APRICOTS_Definitions::DBError, APRICOTS_Definitions::NotFound,

APRICOTS_Definitions::AccessDenied);

beim Storage Agent persistent ab. Hierbei wird der Transaktionszustand (taStatus) auf ACTIVE und der Bearbeitungszustand (pStatus) auf NEW gesetzt. Der Identifikator, mit dem der Benutzeragent später die ihm gehörenden Aufgaben wiederfinden kann, ist der Name des Benutzers (AgentName), den das Schnittstellenobjekt zur ConTract Engine beim Zu-standsobjekt erfragen kann.

Abbildung 33: Eintreffen der Aufgabe beim Benutzeragenten

Anschließend fordert es das Resource-Verwaltungsobjekt auf, eine Resource für diesen Auftrag anzulegen und beim OTS zu registrieren. Daraufhin wird der Identifikator der Aufgabe (der sich eindeutig aus der ciid und der stepInstance berechnen läßt) zur Abholung durch das Tasklist Interface an die New-Schlange angehängt.

8.2.2 Übermittlung an die Oberfläche

Über das Schnittstellenobjekt zum Tasklist Interface kann die Oberfläche jetzt die verschie-denen Schlangen, also neben der Touched-, der Done- und der Aborted-Schlange auch die New-Schlange, in diesem Fall mittels

string getNewTask()

raises (AgentError);

auslesen. Es findet in der New-Schlange den Identifikator der Aufgabe. Über den Aufruf void getTask(

in string taName, out string request,

out string tasklistInfo, out APRICOTS_Definitions::FileSequence params)

raises (AgentError);

kann es die zu diesem Auftrag gehörenden Dateien (params) und den dem Benutzer anzuzei-genden String (request) abfragen. Um diese Informationen liefern zu können, muß sich das Schnittstellenobjekt zum Tasklist Interface wiederum über

void getTask(

in SessionId session,

in APRICOTS_Definitions::NameString AgentName, in string taName, out APRICOTS_Definitions::ConTractInstanceID ciid,

out APRICOTS_Definitions::StepInstance stepInstance, out string recoveryCoordinatorString, out string markerString, out string request,

out ProcessingStatus pStatus, out TAStatus taStatus, out string tasklistInfo, out APRICOTS_Definitions::FileSequence files)

raises (APRICOTS_Definitions::DBError, APRICOTS_Definitions::NotFound,

APRICOTS_Definitions::AccessDenied);

an den Storage Agent wenden.

Aufgabe abholen

Aufgabe abholen ConTract

Engine

Benutzer-agent

Tasklist Interface und Benutzer Storage

Agent

Abbildung 34: Übermittlung der Aufgabe an die Oberfläche

Das Tasklist Interface verfügt nun über alle benötigten Informationen. Der Benutzer hat jetzt mehrere Möglichkeiten, was er mit der Aufgabe tun kann:

• Zurückweisen der Aufgabe.

• Abfragen der vorhergehenden Bearbeiter einer zu der Aufgabe gehörenden Datei.

• Bearbeiten der Aufgabe.

8.2.3 Zurückweisen der Aufgabe

Wenn der Benutzer die erhaltene Aufgabe nicht bearbeiten will, kann er diese über void rejectTask(in string taName)

raises (AgentError);

zurückweisen. Das Schnittstellenobjekt zum Tasklist Interface löscht daraufhin den Auftrag beim Storage Agent mittels

void deleteTask(in SessionId session, in APRICOTS_Definitions::NameString AgentName, in string taName) raises (APRICOTS_Definitions::DBError,

APRICOTS_Definitions::NotFound,

APRICOTS_Definitions::AccessDenied);

und gibt der ConTract Engine die Aufgabe mit dem Vermerk „nicht erfolgreich beendet“

(SSRES_UNSUCCESSFUL als result) zurück:

void stepServerReply (

in APRICOTS_Definitions::StepInstance stepInstance, in APRICOTS_Definitions::StepServerResult result,

in APRICOTS_Definitions::OutParameterSeq outParameterSeq ) raises ( Reject );

Aufgabe als „nicht erfolgreich beendet“

zurückgeben

Aufgabe löschen

Aufgabe zurückweisen ConTract

Engine

Benutzer-agent

Tasklist Interface und Benutzer Storage

Agent

Abbildung 35: Zurückweisen einer Aufgabe durch den Benutzer

8.2.4 Abfrage der bisherigen Bearbeiter

Falls der Benutzer wissen möchte, wer vor ihm ein bestimmtes Dokument bearbeitet hat, kann er dies beim Schnittstellenobjekt zum Tasklist Interface erfragen. Dieser Vorgang ist bereits in Kapitel 4.3 dargestellt.

8.2.5 Rückgabe einer teilweise bearbeiteten Aufgabe

Im Falle daß der Benutzer dem Benutzeragenten eine nur teilweise bearbeitete Aufgabe zu-rückgeben möchte, etwa weil er vor seinem Feierabend einen Auftrag nicht mehr vollständig abarbeiten konnte, kann er dies über die Schnittstelle

void giveTouchedTask(

in string taName,

in string tasklistInfo,

in APRICOTS_Definitions::FileSequence params) raises (AgentError);

des Schnittstellenobjekts zum Tasklist Interface tun. Dieses wird die vom Tasklist Interface übermittelten Teilergebnisse mittels der auch zum Abspeichern von neu eingetroffenen Aufträ-gen verwendeten Schnittstelle setTask im Storage AAufträ-gent abspeichern. Der Bearbeitungssta-tus (pStaBearbeitungssta-tus) wird dabei auf TOUCHED gesetzt. Dementsprechend wird der Identifikator dieses Auftrages in die Touched-Schlange eingereiht.

Der Benutzer erhält den Identifikator dieser Aufgabe also wieder, wenn er zu einem späteren Zeitpunkt durch

string getTouchedTask() raises (AgentError);

einen schon von ihm angefangenen Auftrag abholen möchte. Das weitere Vorgehen ist analog zum oben beschriebenen Fall einer noch nicht begonnenen Aufgabe: Das Tasklist Interface

zeigenden String erfragen. Auch hier greift das Schnittstellenobjekt zum Tasklist Interface auf den Storage Agent zu.

teilweise bearbeitete

Abbildung 36: Rückgabe einer teilweise bearbeiteten Aufgabe durch den Benutzer

8.2.6 Rückgabe einer vollständig bearbeiteten Aufgabe

Hat der Benutzer eine Aufgabe fertig bearbeitet, so kann er die Ergebnisse über die - bis auf den Namen wie giveTouchedTask aussehende Schnittstelle - giveDoneTask des Schnittstellenobjekts an den Benutzeragenten übergeben.

Diese Arbeitsergebnisse werden, wie im Falle einer teilweise bearbeiteten Aufgabe beschrieben, durch setTask beim Storage Agent abgespeichert; in diesem Falle mit dem Bearbeitungssta-tus (pStaBearbeitungssta-tus) DONE.

Anschließend liefert das Schnittstellenobjekt zum Tasklist Interface das Resultat an die zu-ständige ConTract Engine; wie beim Zurückweisen einer Aufgabe wird hierzu die Methode stepServerReply verwendet, allerdings lautet das Resultat (result) nun nicht auf SSRES_UNSUCCESSFUL sondern auf SSRES_NOERR.

Arbeitsergebnisse

Abbildung 37: Rückgabe einer vollständig bearbeiteten Aufgabe durch den Benutzer

8.2.7 Erfolgreiches Beenden einer Transaktion

Nachdem die ConTract Engine ein Aufgabenergebnis vom Benutzeragenten mit dem Vermerk SSRES_NOERR erhalten hat, fordert sie als Transaction Originator das OTS dazu auf, das Commit-Protokoll ablaufen zu lassen.

Die Resource, die an der zur entsprechenden Aufgabe gehörenden Transaktion teilnimmt, er-hält daraufhin vom OTS den Aufruf

Vote prepare ();

Der beim Storage Agent abgespeicherte Transaktionszustand (taStatus) der Aufgabe wird nun durch

void setTAStatus(

in SessionId session, in APRICOTS_Definitions::NameString agentName, in string taName, in TAStatus taStatus) raises (APRICOTS_Definitions::DBError,

APRICOTS_Definitions::NotFound,

APRICOTS_Definitions::AccessDenied);

auf PREPARED gesetzt; die Resource kann jetzt für den Ausgang der Transaktion mit VoteCommit votieren.

Aufgabe an

Committed-Schlange hängen

Zustand auf COMMITTED setzen Commit

Transaktionszustand auf PREPARED setzen

OTS

Benutzer-agent

Tasklist Interface und Benutzer Storage

Agent Prepare

Abbildung 38: Eine Transaktion wird erfolgreich beendet

Wenn auch alle übrigen Teilnehmer an der Transaktion ein positives Votum abgeben, wird die Resource kurz darauf durch

void commit ()

raises ( NotPrepared, HeuristicRollback, HeuristicMixed, HeuristicHazard );

von einem positiven Ausgang in Kenntnis gesetzt. Auch jetzt wird der Transaktionszustand (taStatus) mittels setTAStatus geändert, und zwar diesmal auf COMMITTED. An-schließend wird der Identifikator der zugehörigen Aufgabe an die Committed-Schlange ange-hängt.

8.2.8 Löschen der Aufgabe durch den Benutzer

Der Benutzer kann nun beim Schnittstellenobjekt zum Tasklist Interface über string getCommittedTask()

raises (AgentError);

die Identifikatoren der zu erfolgreich beendeten Transaktionen gehörenden Aufgaben abfragen.

Hat er keine Verwendung mehr für seine Arbeitsergebnisse, hat er die Möglichkeit, diese mit-tels

void deleteTask(in string taName) raises (AgentError);

löschen zu lassen. Dieser Aufruf wird vom Schnittstellenobjekt durch die deleteTask-Schnittstelle an den Storage Agent weitergeleitet.

Aufgabe löschen

Aufgabe löschen Aufgabe aus der Committed-Schlange

abfragen ConTract

Engine

Benutzer-agent

Tasklist Interface und Benutzer Storage

Agent

Abbildung 39: Der Benutzer kann eine erfolgreich beendete Aufgabe löschen

8.2.9 Abbruch der Transaktion

Beim Abbruch einer Transaktion erhält, wie im Erfolgsfall, die zugehörige Resource - jetzt al-lerdings nicht über commit sondern über

void rollback ()

raises ( HeuristicCommit, HeuristicMixed, HeuristicHazard );

eine Mitteilung vom OTS. Der beim Storage Agent abgelegte Transaktionszustand (taStatus) der zu dieser Transaktion gehörenden Aufgabe wird nun analog zum Commit-Fall durch setTAStatus aktualisiert und auf ABORTED gesetzt. Der Identifikator des Auf-trages wird an die Aborted-Schlange angehängt, wo sie das Tasklist Interface durch die im Schnittstellenobjekt zum Tasklist Interface enthaltene Schnittstelle

string getAbortedTask() raises (AgentError);

abfragen kann. Wie bei einer erfolgreich beendeten Aufgabe kann der Benutzer über die Me-thode deleteTask auch diese löschen.

Aufgabe an Aborted-Schlange hängen Zustand auf

ABORTED setzen Abort

Aufgabe löschen

Aufgabe löschen Aborted-Schlange

abfragen

OTS

Benutzer-agent

Tasklist Interface und Benutzer Storage

Agent

Abbildung 40: Eine Transaktion wird abgebrochen