DeferredResultProcessingInterceptor
和 CallableProcessingInterceptor
在于异步请求处理的拦截器接口,但它们适用于不同的场景和需求。
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
一起使用,提供了对异步结果的直接控制。Callable
与CallableProcessingInterceptor
一起使用,允许你在异步任务执行期间和之后执行特定的逻辑。
不同业务如何选择:
- 如果业务需求中涉及到需要设置异步请求的超时时间,并在超时时返回特定的错误响应,应选择
DeferredResult
和DeferredResultProcessingInterceptor
。 - 如果业务需求中涉及到需要执行可能长时间运行的任务,并且可能需要在任务执行期间取消任务或处理任务执行中的异常,应选择
Callable
和CallableProcessingInterceptor
。 - 根据业务逻辑的复杂性和对异步处理的不同需求,选择最适合的异步处理机制。