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.