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);
                    
                
                
            
        
浙公网安备 33010602011771号