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.21. Implementierung eines Node
s
package com.mycompany.jadice.client; import com.levigo.jadice.server.Node; public class DemoNode extends Node { public String getWorkerClassName() { // Full qualified class name of the worker class 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.22. Erweiterung des Node
s aus Beispiel 6.21, „Implementierung eines Node
s“ um einen Parameter
public String getMyParameter() { // Should be modifiable via a setter method 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.23. 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 { // Parameter as defined in the example above String myParam = getNode().getMyParameter(); // Retrive input data for (Stream stream : getInputBundle()) { InputStream unprocessedIS = stream.getInputStream(); // Meta data of the received stream StreamDescriptor unprocessedSD = stream.getDescriptor(); // Method to process the data (not shown here) InputStream processedIS = process(unprocessedIS, myParam); // Meta data of the processed data // unprocessedSD is set as "parent" StreamDescriptor processedSD = new StreamDescriptor(unprocessedSD); processedSD.setDescription("<Beschreibung>"); processedSD.setMimeType("<MIME Type>"); processedSD.setFileName("<Dateiname>"); // Link result result with its meta data Stream result = new BundledStream(processedIS, processedSD); // pass the result 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.21, „Implementierung eines Node
s“ automatisch aufgerufen.