springmvc DeferredResult处理异步请求
DeferredResult
使用场景:类似于Callable,但相比于Callable使用更复杂的业务情况:对于一次请求,其处理结果可能是其它系统(线程)才能处理的,
在其它系统(线程)未将结果处理完放进DeferredResult中之前一直阻塞
A controller method can also return a DeferredResult
(new type in Spring MVC 3.2) to complete processing in a thread not known to Spring MVC. For example reacting to a JMS or an AMQP message, a Redis notification, and so on. Here is another code snippet
示例:
@RequestMapping("/front/test_DeferredResult") public DeferredResult<String> testDefer() { //3000L超时时间,time out超时说明 DeferredResult<String> deferredResult = new DeferredResult<String>(3000L,"time out"); // 在其它线程给deferredResult设置处理结果后会返回给客户端 // 模拟队列 SampleQueen.add(deferredResult); return deferredResult; } @RequestMapping("/front/set_DeferredResult") public String setResult2DeferredResult() { DeferredResult<String> deferredResult = SampleQueen.get(); //模拟队列将处理结果放回 deferredResult.setResult("test success"); return "set test success"; }
在访问/front/test_DeferredResult时会在超时范围内等待
在模拟其他消息处理的请求/front/set_DeferredResult将结果放回DeferredResult后,/front/test_DeferredResult会得到响应。
//同样DeferredResult提供超时及完成后的处理任务,视具体业务而定
//deferredResult.onTimeout(Runnable);
//deferredResult.onCompletion(Runnable);