Restlight 异步保证

Restlight保证在框架层面对所有的CompletableFuture处理都不会主动的切换执行的线程

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

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

private final Executor customExecutor = ...;
            
@Override
public CompletableFuture<Boolean> preHandle0(AsyncRequest request,
                                             AsyncResponse response,
                                             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!";
}

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

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