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
  • 根据业务逻辑的复杂性和对异步处理的不同需求,选择最适合的异步处理机制。
相关推荐
万邦科技Lafite13 分钟前
淘宝店铺所有商品API接口实战指南
java·数据库·mysql
jjjxxxhhh12342 分钟前
【加密】-AES与对称加密
java·服务器·网络
临水逸43 分钟前
飞牛fnos 2025 漏洞Java跨域URL浏览器
java·开发语言·安全·web安全
yaoxin5211231 小时前
324. Java Stream API - 实现 Collector 接口:自定义你的流式收集器
java·windows·python
H Corey1 小时前
数据结构与算法:高效编程的核心
java·开发语言·数据结构·算法
米羊1211 小时前
Struts 2 漏洞(上)
java·后端·struts
galaxyffang1 小时前
Java堆内存诊断:从工具使用到实战分析
java·jvm
梵得儿SHI1 小时前
Spring Cloud 实战攻坚:企业级用户服务开发(注册登录 + JWT 认证 + 权限控制)
后端·spring·spring cloud·用户注册与登录·jwt无状态认证体系·rbac权限控制·微服务用户中心
Tadas-Gao2 小时前
基于规范驱动开发的下一代软件工程范式:从理论到实践
驱动开发·架构·系统架构·大模型·llm·软件工程
HAPPY酷2 小时前
C++ 成员指针(Pointer to Member)完全指南
java·c++·算法