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

22 篇文章 0 订阅
20 篇文章 0 订阅

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

肖哥弹架构 跟大家“弹弹” SpringBoot源码,需要代码关注

欢迎 点赞,点赞,点赞。

关注公号Solomon肖哥弹架构获取更多精彩内容

DeferredResultProcessingInterceptor 业务场景:

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

适用场景:

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

关键处理代码示例:

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 通常用于那些需要长时间运行的任务,它返回一个结果,并且可以在任务执行期间取消任务。

适用场景:

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

关键处理代码示例:

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
  • 根据业务逻辑的复杂性和对异步处理的不同需求,选择最适合的异步处理机制。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Solomon_肖哥弹架构

你的欣赏就是我最大的动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值