public final CompletionStage<Void> onTimer(MessageCollector collector, TaskCoordinator coordinator) {
    long startNs = this.highResClock.nanoTime();
    Collection<RM> results = handleTimer(collector, coordinator);
    long endNs = this.highResClock.nanoTime();
    this.handleTimerNs.update(endNs - startNs);

    CompletionStage<Void> resultFuture = CompletableFuture.allOf(
        results.stream()
            .flatMap(r -> this.registeredOperators.stream()
                .map(op -> op.onMessageAsync(r, collector, coordinator)))
            .toArray(CompletableFuture[]::new));

    return composeFutureWithExecutor(resultFuture, x -> CompletableFuture.allOf(this.registeredOperators.stream()
        .map(op -> op.onTimer(collector, coordinator))
        .toArray(CompletableFuture[]::new)));
  }
Handle timer ticks for this {@link OperatorImpl} and propagate the results and timer tick to registered operators.
<p>
Delegates to {@link #handleTimer(MessageCollector, TaskCoordinator)} for handling the timer tick.

@param collector  the {@link MessageCollector} in the context
@param coordinator  the {@link TaskCoordinator} in the context
samza-core/src/main/java/org/apache/samza/operators/impl/OperatorImpl.java