Eine zweite Message



Ein Target, welches sich selbst eine Message zuschickt (Version 2).

Im zweiten Beispiel haben wir gesehen, wie ein Target sich selbst eine Message zuschickte. Dazu hat es die Convience-Methode triggerThisTarget() aus der Klasse CTarget verwendet. Nun verschicken wir eine selbst gebaute Nachricht.

final class CTarget003 extends CTarget
{
    private static final IId TESTID = CIdFactory.create("Yippee!");

    CTarget003()
    {
        addMessageHandler(CRecordStartTarget.ID, new IMessageHandler()
        {
            @Override
            public boolean handleMessage(final CEnvelope aEnvelope,
                                         final CRecord aRecord) throws Exception
            {
                final INamespace namespace = getNamespace();
                CConstants.LOG.debug("Target003: My namespace is {}", namespace);

                // and a hand made message
                anotherTrigger();

                // means success
                aEnvelope.setResult(null);

                // means we have consumed this message
                return true;
            }

            private void anotherTrigger() throws CException
            {
                final CEnvelope env = new CEnvelope(getAddress());
                final CRecord rec = new CRecord(TESTID);
                sendNotification(env, rec);
            }
        });

        addMessageHandler(TESTID, new IMessageHandler()
        {
            @Override
            public boolean handleMessage(final CEnvelope aEnvelope,
                                         final CRecord aRecord) throws Exception
            {
                CConstants.LOG.debug(aRecord.getId().toString());

                aEnvelope.setResult(null);
                return true;
            }
        });

    }
}

Wir haben im MessageHandler eine Methode zum Verschicken einer Nachricht eingebaut. Das Auslagern des Codes haben wir uns zur Gewohnheit gemacht, falls die Methode doch noch ein weiteres Mal verwendet werden sollte. Außerdem ist so immer alles hübsch gegliedert.

In der Methode anotherTrigger() legen wir die zwei Bestandteile einer Message an: den Envelope und den Record. Der Envelope transportiert u.a. die Empfänger-Adresse (die unseres Targets, bekommen wir über getAddress()). Der Record trägt die Record-ID. Das Ganze verschicken wir mit sendNotification(), was bedeutet, wir verzichten auf eine Antwort. Die Sender-Adresse (in diesem Beispiel dieselbe Adresse) wird übrigens von der Methode sendNotification() eingetragen, wir müssen uns also nicht darum kümmern.

Der zweite MessageHandler gibt dann lediglich wieder die ID des Records aus.

Jetzt haben wir immer noch keine Daten transportiert. Das erfolgt im nächsten Beispiel.

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