Example usage for org.springframework.web.context.request.async DeferredResult DeferredResult

List of usage examples for org.springframework.web.context.request.async DeferredResult DeferredResult

Introduction

In this page you can find the example usage for org.springframework.web.context.request.async DeferredResult DeferredResult.

Prototype

public DeferredResult(Long timeoutValue) 

Source Link

Document

Create a DeferredResult with a custom timeout value.

Usage

From source file:com.sishuok.chapter3.web.controller.DeferredResultController.java

@RequestMapping("/message")
@ResponseBody/*  w  ww .j  a  v  a  2s  .co m*/
public DeferredResult<String> newMessage() throws IOException {

    //1?DeferredResult
    long timeout = 30L * 1000;
    final DeferredResult<String> result = new DeferredResult<String>(timeout);

    result.onCompletion(new Runnable() {
        @Override
        public void run() {
            queue.remove(result);
        }
    });

    result.onTimeout(new Runnable() {
        @Override
        public void run() {
            queue.remove(result);
        }
    });

    //2????
    queue.add(result);
    return result;
}

From source file:org.springframework.web.servlet.mvc.method.annotation.ResponseBodyEmitterReturnValueHandler.java

@Override
public void handleReturnValue(@Nullable Object returnValue, MethodParameter returnType,
        ModelAndViewContainer mavContainer, NativeWebRequest webRequest) throws Exception {

    if (returnValue == null) {
        mavContainer.setRequestHandled(true);
        return;/*from  ww  w.j av  a  2s. c o m*/
    }

    HttpServletResponse response = webRequest.getNativeResponse(HttpServletResponse.class);
    Assert.state(response != null, "No HttpServletResponse");
    ServerHttpResponse outputMessage = new ServletServerHttpResponse(response);

    if (returnValue instanceof ResponseEntity) {
        ResponseEntity<?> responseEntity = (ResponseEntity<?>) returnValue;
        response.setStatus(responseEntity.getStatusCodeValue());
        outputMessage.getHeaders().putAll(responseEntity.getHeaders());
        returnValue = responseEntity.getBody();
        returnType = returnType.nested();
        if (returnValue == null) {
            mavContainer.setRequestHandled(true);
            outputMessage.flush();
            return;
        }
    }

    ServletRequest request = webRequest.getNativeRequest(ServletRequest.class);
    Assert.state(request != null, "No ServletRequest");

    ResponseBodyEmitter emitter;
    if (returnValue instanceof ResponseBodyEmitter) {
        emitter = (ResponseBodyEmitter) returnValue;
    } else {
        emitter = this.reactiveHandler.handleValue(returnValue, returnType, mavContainer, webRequest);
        if (emitter == null) {
            // Not streaming..
            return;
        }
    }
    emitter.extendResponse(outputMessage);

    // At this point we know we're streaming..
    ShallowEtagHeaderFilter.disableContentCaching(request);

    // Commit the response and wrap to ignore further header changes
    outputMessage.getBody();
    outputMessage.flush();
    outputMessage = new StreamingServletServerHttpResponse(outputMessage);

    DeferredResult<?> deferredResult = new DeferredResult<>(emitter.getTimeout());
    WebAsyncUtils.getAsyncManager(webRequest).startDeferredResultProcessing(deferredResult, mavContainer);

    HttpMessageConvertingHandler handler = new HttpMessageConvertingHandler(outputMessage, deferredResult);
    emitter.initialize(handler);
}