In diesem Kapitel soll anhand eines einfachen Beispiels gezeigt werden, wie der jadice server
um eigene Nodes 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 Nodes
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 Nodes aus Beispiel 6.18, „Implementierung eines Nodes“ 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 Nodes 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 NodeWorkers
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 Nodes aus
Beispiel 6.18, „Implementierung eines Nodes“ automatisch aufgerufen.


