1、Runnable 方式
2、DeferredResult 方式
@RequestMapping("/order")
public DeferredResult<String> order() throws Exception {
logger.info("主线程开始");
String orderNumber = RandomStringUtils.randomNumeric(8);
mockQueue.setPlaceOrder(orderNumber);
DeferredResult<String> result = new DeferredResult<>(); //设置DeferredResult
deferredResultHolder.getMap().put(orderNumber, result);
return result;
}
deferredResultHolder.getMap().get(orderNumber).setResult("place order success"); //另一个地方完成DeferredResult
3、对于这种异步controller方法如何配置 Interceptor 进行拦截?
@Configuration
public class WebConfig extends WebMvcConfigurerAdapter {
@Override
public void configureAsyncSupport(AsyncSupportConfigurer configurer) { //注册异步controller方法的Interceptor
configurer.registerCallableInterceptors(...);
configurer.registerDeferredResultInterceptors(...);
}
@Override
public void addInterceptors(InterceptorRegistry registry) { //注册同步controller方法的Interceptor
// registry.addInterceptor(timeInterceptor);
}
}