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);

posted @ 2019-03-07 15:08  木码人  阅读(2231)  评论(0编辑  收藏  举报