Targets

Nachrichten werden immer von Targets verarbeitet. Das sind Klassen, die das Interface ITarget implementieren bzw. von der Klasse CTarget abgeleitet wurden.

Targets sind sehr leichtgewichtig. Sie werden in einem Namespace registriert und erhalten dabei zum einen eine ID, die TID, welche eindeutig in diesem Namespace ist. Die Registrierung selbst ist auch sehr leichtgewichtig, sodass Targets einfach und in Mengen angelegt werden können.

Bei der Registrierung erhalten Targets eine ID, die TID, welche eindeutig in diesem Namespace ist. Die TID kann auch bei der Registrierung mitgegeben werden, falls man eine besondere ID haben möchte.

Mit der ID steht auch die Adresse des Targets fest, mit der es Nachrichten empfangen kann. Sie folgt der Form TID.NID.NODEID und besteht aus der oben genannten Target-ID TID, der Namespace-ID NID und der NODE-ID NODEID für den NODE.

Damit Nachrichten an das Target zur Verarbeitung gelangen können, registriert man typischerweise im Konstruktor Message-Handler. Es können beliebig viele Message-Handler hinzugefügt werden. Wird ein Message-Handler für ID=null hinzugefügt, bekommt dieser alle nicht explizit aufgefangenen Nachrichten.

Die erste Nachricht, welche ein Target bekommt, ist die "StartTarget"-Message. Im Code sieht das so aus:

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

Ab diesem Zeitpunkt ist das Target registriert und kann auf die Umgebung zugreifen, z.B. mit getKernel() oder getNamespace(). Die Nachricht "StartTarget" wird übrigens schon asynchron zugestellt, also in dem Thread, in dem das Target registriert wird.

Das setzen des Results auf null ist hilfreich, um dem Aufrufer zu zeigen, dass erstens kein Fehler aufgetreten ist. Wird die Nachricht nicht bearbeitet, muss von der Methode false zurückgegeben werden. Das führt zu einem Fehlercode NOT_HANDLED in der Message. Exceptions während der Bearbeitung werden aufgefangen, der Fehlercode EXCEPTION eingetragen und die Nachricht mit Fehlertext zurückgeschickt. Fehler werden natürlich auch geloggt.

Die Registrierung ist übrigens genau so einfach:

final ITarget t1 = new CTestApp();
getNamespace().getTargetRegistry().registerTarget(t1);
System.out.println(t1.getAddress());