Ein einfaches Target



Ein simples Target, welches lediglich chillt.

Fangen wir doch einfach mit Targets an. Targets sind die Klassen, die Messages empfangen können. Sie implementieren das Interface ITarget bzw. werden von CTarget abgeleitet.

Das hier ist ein sehr einfaches Target, welches nur einen MessageHandler enthält.

final class CTarget001 extends CTarget
{
    CTarget001()
    {
        addMessageHandler(CRecordStartTarget.ID, new IMessageHandler()
        {
            @Override
            public boolean handleMessage(final CEnvelope aEnvelope,
                                         final CRecord aRecord) throws Exception
            {
                aEnvelope.setResult(null);
                return true;
            }
        });
    }
}

Der MessageHandler wird vom System aufgerufen, wenn eine Message CRecordStartTarget an das Target geschickt wird. Er hat eine Methode, welche zwei Argumente übergeben bekommt. Der Envelope und der Record sind die beiden Bestandteile einer Message. Der Rückgabewert ist ein boolean, welcher dem System anzeigt, ob die Message behandelt wurde. Die Verarbeitung im MessageHandler darf Exceptions werfen. Diese werden aufgefangen, protokolliert, und der Message-Text wird der automatisch versandten Message-Antwort als Fehler-Text hinzugefügt.

Die Message CRecordStartTarget wird asynchron an das Target verschickt, nachdem es in der TargetRegistry eines Namespaces registriert wurde. Es ist die erste Message, die ein Target bekommt, und sie wird schon in dem Thread zugestellt, dem das Target bei der Registrierung zugeordnet wurde. Auf jeden Fall ist dieser MessageHandler ein guter Ort, eine erste Message zu verschicken, da die Umgebung (Kernel, Namespace und die eigene TargetAdresse) erst nach der Registrierung verfügbar sind.

Der Envelope trägt die Meta-Daten einer Message, die wir zum ordnungsgemäßen Messaging benötigen. Dazu gehört unter anderem auch der Result-Code und der Result-Text, den wir im MessageHandler auf okay (hier null) setzen. Da die Nachricht unter Umständen vom System wieder and den Sender als Antwort zurückgeht, gehört es zum guten Ton, Erfolg oder Fehler zu signalisieren. Das machen wir hier.

Damit das Target funktioniert, muss es noch dem System bekannt gemacht werden. Dazu registriert man das Target in einer TargetRegistry. Die TargetRegistry ist wiederum Bestandteil eines Namespaces, neben anderen wichtigen Sachen wie ein oder mehrere Threads, eine ServiceRegistry usw. Der Namespace ist so eine Art Unterbau für Applikationen.

Die Registrierung ist simple:

namespace.getTargetRegistry().registerTarget(new CTarget001());

Dieses Target macht noch gar nichts. Daher legen wir gleich das nächste Target an.

Diese Beispiele findest du im Projekt D1ExamplesNode001 im package de.softdevel.d1.examples.node001.example001.