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
  • 根据业务逻辑的复杂性和对异步处理的不同需求,选择最适合的异步处理机制。
相关推荐
mit6.824几秒前
[Meetily后端框架] Whisper转录服务器 | 后端服务管理脚本
c++·人工智能·后端·python
探索java1 分钟前
Java 深入解析:JVM对象创建与内存机制全景图
java·jvm
Sylvia-girl8 分钟前
Java---IDEA
java·开发语言·intellij-idea
Z_W_H_14 分钟前
【Springboot】Bean解释
java·开发语言
CSJ2002031426 分钟前
LUMP+NFS架构的Discuz论坛部署
运维·架构
慧一居士1 小时前
web 系统对接飞书三方登录完整步骤实战使用示例
架构·系统架构
Apipost的同学们1 小时前
AI时代的接口自动化优化实践:如何突破Postman的局限性
后端·ai·架构·postman·自定义函数·apipost·api+ai
Otaku love travel1 小时前
老系统改造增加初始化,自动化数据源配置(tomcat+jsp+springmvc)
java·tomcat·初始化·动态数据源
DKPT1 小时前
Java设计模式之行为型模式(责任链模式)介绍与说明
java·笔记·学习·观察者模式·设计模式
L_autinue_Star1 小时前
手写vector容器:C++模板实战指南(从0到1掌握泛型编程)
java·c语言·开发语言·c++·学习·stl