Ein Einmal-Timer



Dieser Timer kommt nur einmal

Als Kontrast zum Endlos-Timer gibt es auch den Einmal-Timer. Dieser Timer löscht sich selbst, nachdem er eine Timer-Message geschickt hat.

final class CTarget012 extends CTarget
{
    private static final IId TIMER_ID = CIdFactory.create(EIdType.UUID);
    private static final long TIMEOUT = 7000L;

    CTarget012()
    {
        addMessageHandler(CRecordStartTarget.ID, new IMessageHandler()
        {
            @Override
            public boolean handleMessage(final CEnvelope aEnvelope,
                                         final CRecord aRecord) throws Exception
            {
                // The timer will STOP after one message
                getTimerManager().startTimer(TIMER_ID, getAddress(), TIMEOUT, false, null);

                aEnvelope.setResult(null);
                return true;
            }

        });

        addMessageHandler(TIMER_ID, new IMessageHandler()
        {
            @Override
            public boolean handleMessage(final CEnvelope aEnvelope,
                                         final CRecord aRecord) throws Exception
            {
                // We start it again
                getTimerManager().startTimer(TIMER_ID, getAddress(), TIMEOUT, false, null);

                CConstants.LOG.trace("Timer of Node001 Example002 Target002. HiHo!");

                aEnvelope.setResult(null);
                return true;
            }

        });
    }
}

Wird der Timer erneut gestartet, ergibt sich ein ähnliches Verhalten wie beim Endlos-Timer. Ähnlich heißt: Es gibt schon einen Unterschied. Wenn ein Breakpoint in dem Timer-MessageHandler aktiv ist (und nur der Thread gestoppt wird), dann erzeugt das System nicht endlos weitere Timer. Beim Multi-Timer würde das System alle (hier) 7 Sekunden weitere Messages erzeugen, die beim Löschen des Breakpoints das Target fluten würden. Daher gibt es eine klare Empfehlung zur Nutzung von Einmal-Timern.

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