In diesem Kapitel soll anhand eines einfachen Beispiels gezeigt werden, wie der jadice server
um eigene Node
s und NodeWorker
erweitert werden kann, um damit neue
Verarbeitungsschritte realisieren zu können.
Dazu sind im Wesentlichen zwei Schritte notwendig: Zunächst muss eine Node
-Klasse
implementiert werden, die sowohl auf Client- als auch auf der Serverseite vorhanden ist
(siehe Abschnitt „Node-Klasse“).
Danach muss die korrespondierende NodeWorker
-Klasse implementiert
werden (siehe Abschnitt „Worker-Klasse“).
Diese muss nur auf der Serverseite vorhanden sein.
Die neu zu erstellende Nodeklasse muss von der abstrakten Superklasse Node
erben. Sie
muss einen parameterlosen Konstruktor („default constructor“) besitzen.
Außerdem kann die Methode getWorkerClassName()
überschrieben werden. Als
standardmäßigen Rückgabewert liefert diese als Rückgabewert den voll qualifizierten
Klassenname des Node
, wobei Node
durch Worker
ersetzt wird sowie worker
als
zusätzliche Namespace-Ebene eingefügt wird (Bsp:
com.acme.jadiceserver.ExampleNode.getWorkerClassName()
liefert
com.acme.jadiceserver.worker.ExampleWorker
).
Haben Sie eine andere Paketstruktur gewählt, so kann diese Methode überschrieben werden, um den voll qualifizierten Klassennamen der korrespondierenden Workerklasse zu liefern:
Beispiel 6.18. Implementierung eines Node
s
package com.mycompany.jadice.client; import com.levigo.jadice.server.Node; public class DemoNode extends Node { private static final long serialVersionUID = 1L; public String getWorkerClassName() { // Klassenname der Workerklasse return "com.mycompany.jadice.worker.DemoWorker"; }
Soll es möglich sein, dass dem NodeWorker
zur Laufzeit Parameter übermittelt werden,
so kann dies durch weitere Methoden in der Node
-Implementierung erfolgen. Dabei ist
zu beachten, dass alle Objekt- und statischen Attribute das Interface Serializable
implementieren müssen, da diese über JMS serialisiert und transportiert werden
(siehe Abschnitt „Konfiguration des eingebetteten Messagebrokers“).
Beispiel 6.19. Erweiterung des Node
s aus Beispiel 6.18, „Implementierung eines Node
s“ um einen Parameter
public String getMyParameter() { // Sollte z.B. über Setter-Methode gesetzt werden können return "a Parameter"; }
Der selbst implementierte Node
muss sowohl client- als auch serverseitig im
Klassenpfad eingebunden werden und kann genau wie die im Abschnitt „Anwendungsszenarien samt Code-Beispielen“
gezeigten Node
s in eigene Workflows eingebettet werden.
Die Workerklasse, in der die Konvertierung durchführt wird, erbt von der abstrakten,
generischen Superklasse NodeWorker
<N>
, wobei der Typ-Parameter
<N>
für die zugehörige Node
-Klasse steht.
Hier ist die abstrakte Methode work()
zu implementieren, in der die serverseitige
Konvertierung durchführt wird.
Beispiel 6.20. Implementierung eines NodeWorker
s
package com.mycompany.jadice.server; import java.io.InputStream; import com.levigo.jadice.server.core.NodeWorker; import com.levigo.jadice.server.shared.types.BundledStream; import com.levigo.jadice.server.shared.types.Stream; import com.levigo.jadice.server.shared.types.StreamDescriptor; import com.mycompany.jadice.client.DemoNode; public class DemoWorker extends NodeWorker<DemoNode> { protected void work() throws Throwable { // Im Bsp oben definierter Parameter String myParam = getNode().getMyParameter(); // Abholen der Eingabedaten for (Stream stream : getInputBundle()) { InputStream unprocessedIS = stream.getInputStream(); // Metadaten des empfangenen Datenstroms StreamDescriptor unprocessedSD = stream.getDescriptor(); // Methode, die den Datenstrom verarbeitet // (nicht im Listing gezeigt) InputStream processedIS = process(unprocessedIS, myParam); // Metadaten des verarbeitenden Datenstroms // unprocessedSD wird als "parent" gesetzt StreamDescriptor processedSD = new StreamDescriptor(unprocessedSD); processedSD.setDescription("<Beschreibung>"); processedSD.setMimeType("<MIME Type>"); processedSD.setFileName("<Dateiname>"); // Verknüpfen von Ergebnis und Metadaten Stream result = new BundledStream(processedIS, processedSD); // Weitergabe des Ergebnisses getOutputBundle().addStream(result); } } }
Der auf diese Weise implementierte NodeWorker
muss nur im Klassenpfad des jadice server
eingebunden werden und wird bei Verwendung des zugehörigen Node
s aus
Beispiel 6.18, „Implementierung eines Node
s“ automatisch aufgerufen.