@Override
    public long setPeriodicTimer(final long periodMillis, final long initialDelayMillis,
            final IAsyncHandler<Long> periodicHandler) {
        // Make our own ID to cope with initial delay feature not being present in vert.x's timers.
        final long timerId = id++;

        // Do the initial delay, then map the next timer back to our ID.
        long vertxId = vertx.setTimer(initialDelayMillis, (Handler<Long>) tid -> {

            long newVertxId = vertx.setPeriodic(periodMillis,  (Handler<Long>) tid2 -> {
                periodicHandler.handle(timerId);
            });

            // Periodic delay - re-map to the new Vert.x timer ID, as original timer ID is now invalid.
            // Vert.x. is single-threaded per-verticle so this should be safe.
            timerMap.put(timerId, newVertxId);
        });

        timerMap.put(timerId, vertxId);
        return timerId;
    }
@see io.apiman.gateway.engine.components.IPeriodicComponent#setPeriodicTimer(long, long,
     io.apiman.gateway.engine.async.IAsyncHandler)
gateway/platforms/vertx3/vertx3/src/main/java/io/apiman/gateway/platforms/vertx3/components/PeriodicComponentImpl.java