DeferredResultProcessingInterceptor 和 CallableProcessingInterceptor 异步业务场景选择方案

DeferredResultProcessingInterceptorCallableProcessingInterceptor 在于异步请求处理的拦截器接口,但它们适用于不同的场景和需求。

DeferredResultProcessingInterceptor 业务场景:

DeferredResultProcessingInterceptor 主要用于处理基于 DeferredResult 的异步请求。DeferredResult 允许你稍后设置响应,但提供了一个超时机制,如果异步处理在指定时间内没有完成,将发送一个超时响应。

适用场景:

  • 当需要在请求处理中实现超时控制时。
  • 当异步处理完成后需要返回一个特定的响应实体时。

关键处理代码示例:

java 复制代码
import org.springframework.web.context.request.NativeWebRequest;
import org.springframework.web.context.request.async.DeferredResultProcessingInterceptor;
import org.springframework.http.server.ServletServerHttpRequest;
import org.springframework.http.HttpStatus;

public class MyDeferredResultInterceptor implements DeferredResultProcessingInterceptor {

    @Override
    public <T> void afterCompletion(NativeWebRequest request, DeferredResult<T> deferredResult) {
        if (deferredResult.isSetOrExpired()) {
            System.out.println("Deferred result is set or expired.");
        }
        // 清理资源等操作
    }

    @Override
    public <T> boolean handleTimeout(NativeWebRequest request, DeferredResult<T> deferredResult) {
        deferredResult.setErrorResult(HttpStatus.SERVICE_UNAVAILABLE);
        return true; // 表示已处理超时
    }
}

CallableProcessingInterceptor 业务场景:

CallableProcessingInterceptor 用于处理基于 Callable 的异步请求。Callable 通常用于那些需要长时间运行的任务,它返回一个结果,并且可以在任务执行期间取消任务。

适用场景:

  • 当需要执行长时间运行的任务,并且可能需要取消这些任务时。
  • 当需要在任务执行期间处理异常时。

关键处理代码示例:

java 复制代码
import org.springframework.web.context.request.NativeWebRequest;
import org.springframework.web.context.request.async.CallableProcessingInterceptor;

public class MyCallableInterceptor implements CallableProcessingInterceptor {

    @Override
    public <T> Object handleError(NativeWebRequest request, Callable<T> task, Throwable t) {
        // 处理异常,例如记录日志
        System.err.println("Error during callable execution: " + t.getMessage());
        return RESULT_NONE; // 或者 RESPONSE_HANDLED 如果你已经处理了响应
    }
}

场景差异:

  • DeferredResult 更适用于需要超时控制的场景,而 Callable 更适用于可能需要取消操作的场景。
  • DeferredResult 通常与 DeferredResultProcessingInterceptor 一起使用,提供了对异步结果的直接控制。
  • CallableCallableProcessingInterceptor 一起使用,允许你在异步任务执行期间和之后执行特定的逻辑。

不同业务如何选择:

  • 如果业务需求中涉及到需要设置异步请求的超时时间,并在超时时返回特定的错误响应,应选择 DeferredResultDeferredResultProcessingInterceptor
  • 如果业务需求中涉及到需要执行可能长时间运行的任务,并且可能需要在任务执行期间取消任务或处理任务执行中的异常,应选择 CallableCallableProcessingInterceptor
  • 根据业务逻辑的复杂性和对异步处理的不同需求,选择最适合的异步处理机制。
相关推荐
耘田4 小时前
 macOS Launch Agent 定时任务实践指南
java·开发语言·macos
_loehuang_4 小时前
Docker Compose 部署 Maven 私有库 nexus3
java·docker·maven·nexus·maven私有库
汪小成12 小时前
Go 项目结构总是写乱?这个 50 行代码的 Demo 教你标准姿势
后端·go
Piper蛋窝12 小时前
AI 有你想不到,也它有做不到 | 2025 年深度使用 Cursor/Trae/CodeX 所得十条经验
前端·后端·代码规范
韩立学长12 小时前
【开题答辩实录分享】以《在线作业标准流程指导系统的设计与实现》为例进行选题答辩实录分享
java·javascript
一直都在57213 小时前
Spring框架:AOP
java·后端·spring
sheji341613 小时前
【开题答辩全过程】以 基于springboot的健身房管理系统为例,包含答辩的问题和答案
java·spring boot·后端
萧曵 丶13 小时前
JAVA final 详解
java
林shir13 小时前
Java基础2.2-Stream流
java
nbsaas-boot13 小时前
Go 项目中如何正确升级第三方依赖(Go Modules 实战指南)
开发语言·后端·golang