Vereinfachte Request-Bearbeitung mit wait-notify-Technik

Sobald das erwartete Ereignis eintritt, wird die Methode aTimedWait.timedNotify() aufgerufen, um einen TimedWait-Monitor freizugeben (unblock). Es gibt die nützliche Methode timedWait(long waitTime,longtimeout,TimedWaitListenerlsn), die einen Listener erwartet, der auf einen Statuswechsel von TimedWait wartet. Der Status kann waiting, ready oder timeout sein. Das ist praktisch, wenn man einen Benutzer über den Statuswechsel einer lang laufenden Aufgabe informieren will (Listing B).

Um das TimedWait-Interface zu verwenden, muss man es erweitern und die Methode isCondition() implementieren, die anzeigt, dass eine bestimmte Bedingung erfüllt ist. Es gibt eine Default-Implementierung der TimedWait-Klasse (DefaultTimedWait), bei der die isCondition()-Methode einfach eine getter-Methode ist (Listing C).

Wenn man sicherstellen will, dass eine lang laufende Aufgabe nicht blockiert, kann man das folgende Verfahren verwenden:


Man kann noch einen Schritt weiter gehen und die DefaultTimedWait-Klasse so modifizieren, dass sie eine Runnable-Aufgabe ausführt und auf deren Ende oder auf ein Time-out wartet. Das obige Beispiel würde dann wie folgt aussehen:


Request-Dispatching

Nachdem man sich mit der wait-notify-Technik vertraut gemacht hat, sollte man überprüfen, wie man Objekt-Requests dispacht, die asynchron verarbeitet werden müssen. Es gibt viele Fälle, in eine solche Architektur anwendbar ist: So zum Beispiel in der Bereitstellung einer Socket-Verbindung für die Kommunikation zwischen Objekten, wenn Datentransfer und Verarbeitungszeit unbegrenzt sind.

Die RequestProcessor-Klasse zeigt das Designprinzip für das Request-Dispatching (Listing D). Die Hauptmethode ist putRequestWait(), welche ein Request-Objekt zur Bearbeitung verschickt und auf die Ankunft der Response wartet. Gibt es keine Response innerhalb einer vorgegebene Zeit, wird eine Timeout-Exception ausgelöst. Diese Klasse verfügt über eine abstrakte onRequest()-Methode, die für die Request-Bearbeitung sorgt. Wenn man diese Klasse sicher in einer Multithread-Umgebung verwenden will, muss man sicherstellen, dass die onRequest()-Methode keine Anweisungen ausführt, die für eine lange Zeit laufen und daher diese Instanz blockieren. Am besten ist es, wenn die onRequest()-Methode selbst für die Request-Bearbeitung sorgt oder einen Request weiterleitet. Falls man damit rechnet, dass die Ausführung der Methode längere Zeit in Anspruch nehmen wird, kann man auch ein Piping-Verfahren einsetzen oder einen neuen Thread erzeugen.

Der RequestProcessor greift auf die TimedWait-Klasse zurück und erstellt eine Instanz als Lock für jeden Request. Einer oder mehrere Requests können ein und dieselbe Request-Bearbeitung auslösen. Falls mehrere identische Requests verschickt werden, löst nur der erste die Request-Bearbeitung aus, aber alle Requestors werden benachrichtigt, sobald eine Response ankommt. Wenn man immer nur einen Request zur Zeit bearbeiten lassen will, kann man die putRequestWait()-Methode so konfigurieren, dass sie eine Exception auslöst, sobald mehrere identische Requests gleichzeitig zur Bearbeitung geschickt werden (Listing E).

Themenseiten: Anwendungsentwicklung, Software

Fanden Sie diesen Artikel nützlich?
Content Loading ...
Whitepaper

Artikel empfehlen:

Neueste Kommentare 

Noch keine Kommentare zu Vereinfachte Request-Bearbeitung mit wait-notify-Technik

Kommentar hinzufügen

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind markiert *