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).

Page: 1 2

ZDNet.de Redaktion

Recent Posts

Vorinstallierte Schadsoftware auf IoT-Geräten

Mit dem Internet verbundene Digitale Bilderrahmen oder Mediaplayer können mit Schadsoftware infiziert werden und sind…

6 Tagen ago

iOS und iPadOS 18.2 beseitigen 21 Sicherheitslücken

Schädliche Apps können unter Umständen einen Systemabsturz auslösen. Mindestens eine Anfälligkeit erlaubt eine Remotecodeausführung.

7 Tagen ago

Top-Malware im November: Infostealer Formbook bleibt Nummer 1

Sein Anteil an allen Infektionen steigt in Deutschland auf 18,5 Prozent. Das Botnet Androxgh0st integriert…

7 Tagen ago

Google schließt schwerwiegende Sicherheitslücken in Chrome

Betroffen sind Chrome 131 und früher für Windows, macOS und Linux. Angreifer können unter Umständen…

7 Tagen ago

Data Analytics: Dienstleister wachsen zweistellig

Marktforscher Lündendonk erwartet für das Jahr 2025 ein durchschnittliches Umsatzwachstum von 14,9 Prozent.

1 Woche ago

Open-Source-Malware auf Rekordniveau

Alarmierender Anstieg von Open-Source-Malware / Seit 2019 haben Sonatype-Analysen mehr als 778.500 bösartige Pakete aufgedeckt

1 Woche ago