Code review comment: The callbacks of `with(...)` might be called just right after the subscription if data is already there or if the workload it triggers is synchronous (e.g. you compute some value in-memory and there's no async I/O call involved).

Code under review:
public Handler<RoutingContext> clearCacheHandler() {
        return new DevConsolePostHandler() {

            @Override
            protected void handlePost(RoutingContext event, MultiMap form) {
                String cacheName = form.get("name");
                Optional<Cache> cache = CaffeineCacheSupplier.cacheManager().getCache(cacheName);
                if (cache.isPresent() && cache.get() instanceof CaffeineCache) {
                    CaffeineCacheImpl caffeineCache = (CaffeineCacheImpl) cache.get();

                    String action = form.get("action");
                    if (action.equalsIgnoreCase("clearCache")) {
                        caffeineCache.invalidateAll().subscribe().with(ignored -> {
                            endResponse(event, OK, createResponseMessage(caffeineCache));
                        });
                    } else if (action.equalsIgnoreCase("refresh")) {
                        endResponse(event, OK, createResponseMessage(caffeineCache));
                    } else {
                        String errorMessage = "Invalid action: " + action;
                        endResponse(event, INTERNAL_SERVER_ERROR, createResponseError(cacheName, errorMessage));
                    }
                } else {
                    String errorMessage = "Cache for " + cacheName + " not found";
                    endResponse(event, NOT_FOUND, createResponseError(cacheName, errorMessage));
                }
            }

            private void endResponse(RoutingContext event, HttpResponseStatus status, String message) {
                event.response().setStatusCode(status.code());
                event.response().end(message);
            }

            private String createResponseMessage(CaffeineCacheImpl cache) {
                Json.JsonObjectBuilder object = Json.object();
                object.put("name", cache.getName());
                object.put("size", cache.getSize());
                return object.build();
            }

            private String createResponseError(String name, String error) {
                Json.JsonObjectBuilder object = Json.object();
                object.put("name", name);
                object.put("error", error);
                return object.build();
            }
        };
    }

Line commented on: endResponse(event, NOT_FOUND, createResponseError(cacheName, errorMessage));

Revised code:
public Handler<RoutingContext> clearCacheHandler() {
        return new DevConsolePostHandler() {

            @Override
            protected void handlePost(RoutingContext event, MultiMap form) {
                String cacheName = form.get("name");
                Optional<Cache> cache = CaffeineCacheSupplier.cacheManager().getCache(cacheName);
                if (cache.isPresent() && cache.get() instanceof CaffeineCache) {
                    CaffeineCacheImpl caffeineCache = (CaffeineCacheImpl) cache.get();

                    String action = form.get("action");
                    if (action.equalsIgnoreCase("clearCache")) {
                        caffeineCache.invalidateAll().subscribe().with(ignored -> {
                            endResponse(event, OK, createResponseMessage(caffeineCache));
                        });
                    } else if (action.equalsIgnoreCase("refresh")) {
                        endResponse(event, OK, createResponseMessage(caffeineCache));
                    } else {
                        String errorMessage = "Invalid action: " + action;
                        endResponse(event, INTERNAL_SERVER_ERROR, createResponseError(cacheName, errorMessage));
                    }
                } else {
                    String errorMessage = "Cache for " + cacheName + " not found";
                    endResponse(event, NOT_FOUND, createResponseError(cacheName, errorMessage));
                }
            }

            private void endResponse(RoutingContext event, HttpResponseStatus status, String message) {
                event.response().setStatusCode(status.code());
                event.response().end(message);
            }

            @Override
            protected void actionSuccess(RoutingContext event) {
            }

            private String createResponseMessage(CaffeineCacheImpl cache) {
                Json.JsonObjectBuilder object = Json.object();
                object.put("name", cache.getName());
                object.put("size", cache.getSize());
                return object.build();
            }

            private String createResponseError(String name, String error) {
                Json.JsonObjectBuilder object = Json.object();
                object.put("name", name);
                object.put("error", error);
                return object.build();
            }
        };
    }