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 分钟前
AopAutoConfiguration源码阅读
java·spring boot·intellij-idea
你的人类朋友33 分钟前
【Node.js】什么是Node.js
javascript·后端·node.js
曼岛_1 小时前
[系统架构设计师]系统质量属性与架构评估(八)
架构·系统架构
源码宝1 小时前
【智慧工地源码】智慧工地云平台系统,涵盖安全、质量、环境、人员和设备五大管理模块,实现实时监控、智能预警和数据分析。
java·大数据·spring cloud·数据分析·源码·智慧工地·云平台
AlbertZein2 小时前
HarmonyOS5 凭什么学鸿蒙—— GetContext
架构·harmonyos
David爱编程2 小时前
面试必问!线程生命周期与状态转换详解
java·后端
LKAI.3 小时前
传统方式部署(RuoYi-Cloud)微服务
java·linux·前端·后端·微服务·node.js·ruoyi
天上掉下来个程小白3 小时前
微服务-02.认识微服务-单体架构
微服务·云原生·架构
HeyZoeHey3 小时前
Mybatis执行sql流程(一)
java·sql·mybatis
nshkfhwr3 小时前
什么是微服务
微服务·云原生·架构·云计算·集群