这个保证使得用户无需担心不知道自己的代码将会在什么线程上执行。

用户在HandlerInterceptor中写下了如下代码

private final Executor customExecutor = ...;
            
@Override
public CompletionStage<Boolean> preHandle0(RequestContext context, Object handler) {
    // 线程切换到 customExecutor并回调Restlight
    return CompletableFuture.supplyAsync(() -> {
        // ....
        return true;
    }, customExecutor);
}

其中当执行HandlerInterceptor.preHandle(xxx)时用户使用了自定义的线程池作为异步实现,并在完成操作后回调Restlight, 后续所有Controller, ExceptionHandler等操作都将在customExecutor的线程上执行(除非用户主动切换)

下面的Controller将会在customExecutor的线程上被调用, 而不是业务线程池

@GetMapping(value = "/test")
public String foo() {
    // biz logic
    return "Hello Restlight!";
}

如果需要回到业务线程池执行则需要用户自行通过CompletionStage进行操作

@GetMapping(value = "/test")
public CompletionStage<String> foo() {
    // 回到业务线程池执行Controller逻辑
    return CompletableFuture.supplyAsync(() -> {
        // biz logic
        return  "Hello Restlight!";
    }, bizExecutor);
}