@Override public void handleReturnValue(@Nullable Object returnValue, MethodParameter returnType, ModelAndViewContainer mavContainer, NativeWebRequest webRequest) throws Exception { if (returnValue == null) { mavContainer.setRequestHandled(true); return; } DeferredResult<?> result; if (returnValue instanceof DeferredResult) { result = (DeferredResult<?>) returnValue; } else if (returnValue instanceof ListenableFuture) { result = adaptListenableFuture((ListenableFuture<?>) returnValue); } else if (returnValue instanceof CompletionStage) { result = adaptCompletionStage((CompletionStage<?>) returnValue); } else { // Should not happen... throw new IllegalStateException("Unexpected return value type: " + returnValue); } WebAsyncUtils.getAsyncManager(webRequest).startDeferredResultProcessing(result, mavContainer); }
@Test public void startDeferredResultProcessingNullInput() throws Exception { try { this.asyncManager.startDeferredResultProcessing(null); fail("Expected exception"); } catch (IllegalArgumentException ex) { assertEquals("DeferredResult must not be null", ex.getMessage()); } }
@Override public void handleReturnValue(@Nullable Object returnValue, MethodParameter returnType, ModelAndViewContainer mavContainer, NativeWebRequest webRequest) throws Exception { if (returnValue == null) { mavContainer.setRequestHandled(true); return; } DeferredResult<?> result; if (returnValue instanceof DeferredResult) { result = (DeferredResult<?>) returnValue; } else if (returnValue instanceof ListenableFuture) { result = adaptListenableFuture((ListenableFuture<?>) returnValue); } else if (returnValue instanceof CompletionStage) { result = adaptCompletionStage((CompletionStage<?>) returnValue); } else { // Should not happen... throw new IllegalStateException("Unexpected return value type: " + returnValue); } WebAsyncUtils.getAsyncManager(webRequest).startDeferredResultProcessing(result, mavContainer); }
WebAsyncUtils.getAsyncManager(request).startDeferredResultProcessing(result, mav);
WebAsyncUtils.getAsyncManager(webRequest).startDeferredResultProcessing(deferredResult, mavContainer);
@Test public void startAsyncProcessingWithoutAsyncWebRequest() throws Exception { WebAsyncManager manager = WebAsyncUtils.getAsyncManager(new MockHttpServletRequest()); try { manager.startCallableProcessing(new StubCallable(1)); fail("Expected exception"); } catch (IllegalStateException ex) { assertEquals("AsyncWebRequest must not be null", ex.getMessage()); } try { manager.startDeferredResultProcessing(new DeferredResult<String>()); fail("Expected exception"); } catch (IllegalStateException ex) { assertEquals("AsyncWebRequest must not be null", ex.getMessage()); } }
@Test public void startDeferredResultProcessingErrorAndResumeWithDefaultResult() throws Exception { Exception e = new Exception(); DeferredResult<Throwable> deferredResult = new DeferredResult<>(null, e); this.asyncManager.startDeferredResultProcessing(deferredResult); AsyncEvent event = new AsyncEvent(new MockAsyncContext(this.servletRequest, this.servletResponse), e); this.asyncWebRequest.onError(event); assertTrue(this.asyncManager.hasConcurrentResult()); assertEquals(e, this.asyncManager.getConcurrentResult()); assertEquals("/test", ((MockAsyncContext) this.servletRequest.getAsyncContext()).getDispatchedPath()); }
@Test public void startDeferredResultProcessingAfterTimeoutException() throws Exception { DeferredResult<Integer> deferredResult = new DeferredResult<>(); final Exception exception = new Exception(); DeferredResultProcessingInterceptor interceptor = new DeferredResultProcessingInterceptor() { @Override public <T> boolean handleTimeout(NativeWebRequest request, DeferredResult<T> result) throws Exception { throw exception; } }; this.asyncManager.registerDeferredResultInterceptor("interceptor", interceptor); this.asyncManager.startDeferredResultProcessing(deferredResult); AsyncEvent event = null; this.asyncWebRequest.onTimeout(event); assertTrue(this.asyncManager.hasConcurrentResult()); assertEquals(exception, this.asyncManager.getConcurrentResult()); assertEquals("/test", ((MockAsyncContext) this.servletRequest.getAsyncContext()).getDispatchedPath()); }
@Test public void startDeferredResultProcessingAfterException() throws Exception { DeferredResult<Integer> deferredResult = new DeferredResult<>(); final Exception exception = new Exception(); DeferredResultProcessingInterceptor interceptor = new DeferredResultProcessingInterceptor() { @Override public <T> boolean handleError(NativeWebRequest request, DeferredResult<T> result, Throwable t) throws Exception { throw exception; } }; this.asyncManager.registerDeferredResultInterceptor("interceptor", interceptor); this.asyncManager.startDeferredResultProcessing(deferredResult); Exception e = new Exception(); AsyncEvent event = new AsyncEvent(new MockAsyncContext(this.servletRequest, this.servletResponse), e); this.asyncWebRequest.onError(event); assertTrue(this.asyncManager.hasConcurrentResult()); assertEquals(e, this.asyncManager.getConcurrentResult()); assertEquals("/test", ((MockAsyncContext) this.servletRequest.getAsyncContext()).getDispatchedPath()); }
@Test public void startDeferredResultProcessingTimeoutAndResumeWithDefaultResult() throws Exception { DeferredResult<Integer> deferredResult = new DeferredResult<>(null, 23); this.asyncManager.startDeferredResultProcessing(deferredResult); AsyncEvent event = null; this.asyncWebRequest.onTimeout(event); assertTrue(this.asyncManager.hasConcurrentResult()); assertEquals(23, this.asyncManager.getConcurrentResult()); assertEquals("/test", ((MockAsyncContext) this.servletRequest.getAsyncContext()).getDispatchedPath()); }
@Test public void startDeferredResultProcessingPreProcessException() throws Exception { DeferredResult<Integer> deferredResult = new DeferredResult<>(); Exception exception = new Exception(); DeferredResultProcessingInterceptor interceptor = mock(DeferredResultProcessingInterceptor.class); willThrow(exception).given(interceptor).preProcess(this.asyncWebRequest, deferredResult); setupDefaultAsyncScenario(); this.asyncManager.registerDeferredResultInterceptor("interceptor", interceptor); this.asyncManager.startDeferredResultProcessing(deferredResult); deferredResult.setResult(25); assertEquals(exception, this.asyncManager.getConcurrentResult()); verifyDefaultAsyncScenario(); verify(interceptor).beforeConcurrentHandling(this.asyncWebRequest, deferredResult); }
@Test public void startDeferredResultProcessingErrorAndResumeThroughCallback() throws Exception { final DeferredResult<Throwable> deferredResult = new DeferredResult<>(); deferredResult.onError(new Consumer<Throwable>() { @Override public void accept(Throwable t) { deferredResult.setResult(t); } }); this.asyncManager.startDeferredResultProcessing(deferredResult); Exception e = new Exception(); AsyncEvent event = new AsyncEvent(new MockAsyncContext(this.servletRequest, this.servletResponse), e); this.asyncWebRequest.onError(event); assertTrue(this.asyncManager.hasConcurrentResult()); assertEquals(e, this.asyncManager.getConcurrentResult()); assertEquals("/test", ((MockAsyncContext) this.servletRequest.getAsyncContext()).getDispatchedPath()); }
@Test public void startDeferredResultProcessingPostProcessException() throws Exception { DeferredResult<Integer> deferredResult = new DeferredResult<>(); Exception exception = new Exception(); DeferredResultProcessingInterceptor interceptor = mock(DeferredResultProcessingInterceptor.class); willThrow(exception).given(interceptor).postProcess(this.asyncWebRequest, deferredResult, 25); setupDefaultAsyncScenario(); this.asyncManager.registerDeferredResultInterceptor("interceptor", interceptor); this.asyncManager.startDeferredResultProcessing(deferredResult); deferredResult.setResult(25); assertEquals(exception, this.asyncManager.getConcurrentResult()); verifyDefaultAsyncScenario(); verify(interceptor).beforeConcurrentHandling(this.asyncWebRequest, deferredResult); verify(interceptor).preProcess(this.asyncWebRequest, deferredResult); }
@Test public void startDeferredResultProcessingErrorAndResumeThroughInterceptor() throws Exception { DeferredResult<Integer> deferredResult = new DeferredResult<>(); DeferredResultProcessingInterceptor interceptor = new DeferredResultProcessingInterceptor() { @Override public <T> boolean handleError(NativeWebRequest request, DeferredResult<T> result, Throwable t) throws Exception { result.setErrorResult(t); return true; } }; this.asyncManager.registerDeferredResultInterceptor("interceptor", interceptor); this.asyncManager.startDeferredResultProcessing(deferredResult); Exception e = new Exception(); AsyncEvent event = new AsyncEvent(new MockAsyncContext(this.servletRequest, this.servletResponse), e); this.asyncWebRequest.onError(event); assertTrue(this.asyncManager.hasConcurrentResult()); assertEquals(e, this.asyncManager.getConcurrentResult()); assertEquals("/test", ((MockAsyncContext) this.servletRequest.getAsyncContext()).getDispatchedPath()); }
@Test public void startDeferredResultProcessingTimeoutAndResumeThroughCallback() throws Exception { final DeferredResult<Integer> deferredResult = new DeferredResult<>(); deferredResult.onTimeout(new Runnable() { @Override public void run() { deferredResult.setResult(23); } }); this.asyncManager.startDeferredResultProcessing(deferredResult); AsyncEvent event = null; this.asyncWebRequest.onTimeout(event); assertTrue(this.asyncManager.hasConcurrentResult()); assertEquals(23, this.asyncManager.getConcurrentResult()); assertEquals("/test", ((MockAsyncContext) this.servletRequest.getAsyncContext()).getDispatchedPath()); }
@Test public void startDeferredResultProcessingTimeoutAndResumeThroughInterceptor() throws Exception { DeferredResult<Integer> deferredResult = new DeferredResult<>(); DeferredResultProcessingInterceptor interceptor = new DeferredResultProcessingInterceptor() { @Override public <T> boolean handleTimeout(NativeWebRequest request, DeferredResult<T> result) throws Exception { result.setErrorResult(23); return true; } }; this.asyncManager.registerDeferredResultInterceptor("interceptor", interceptor); this.asyncManager.startDeferredResultProcessing(deferredResult); AsyncEvent event = null; this.asyncWebRequest.onTimeout(event); assertTrue(this.asyncManager.hasConcurrentResult()); assertEquals(23, this.asyncManager.getConcurrentResult()); assertEquals("/test", ((MockAsyncContext) this.servletRequest.getAsyncContext()).getDispatchedPath()); }
@Test public void startDeferredResultProcessingTimeoutAndComplete() throws Exception { DeferredResult<Integer> deferredResult = new DeferredResult<>(); DeferredResultProcessingInterceptor interceptor = mock(DeferredResultProcessingInterceptor.class); given(interceptor.handleTimeout(this.asyncWebRequest, deferredResult)).willReturn(true); this.asyncManager.registerDeferredResultInterceptor("interceptor", interceptor); this.asyncManager.startDeferredResultProcessing(deferredResult); this.asyncWebRequest.onTimeout(ASYNC_EVENT); this.asyncWebRequest.onComplete(ASYNC_EVENT); assertTrue(this.asyncManager.hasConcurrentResult()); assertEquals(AsyncRequestTimeoutException.class, this.asyncManager.getConcurrentResult().getClass()); verify(interceptor).beforeConcurrentHandling(this.asyncWebRequest, deferredResult); verify(interceptor).preProcess(this.asyncWebRequest, deferredResult); verify(interceptor).afterCompletion(this.asyncWebRequest, deferredResult); }
@Test public void startDeferredResultProcessingErrorAndComplete() throws Exception { DeferredResult<Integer> deferredResult = new DeferredResult<>(); DeferredResultProcessingInterceptor interceptor = mock(DeferredResultProcessingInterceptor.class); Exception e = new Exception(); given(interceptor.handleError(this.asyncWebRequest, deferredResult, e)).willReturn(true); this.asyncManager.registerDeferredResultInterceptor("interceptor", interceptor); this.asyncManager.startDeferredResultProcessing(deferredResult); AsyncEvent event = new AsyncEvent(new MockAsyncContext(this.servletRequest, this.servletResponse), e); this.asyncWebRequest.onError(event); this.asyncWebRequest.onComplete(event); assertTrue(this.asyncManager.hasConcurrentResult()); assertEquals(e, this.asyncManager.getConcurrentResult()); verify(interceptor).beforeConcurrentHandling(this.asyncWebRequest, deferredResult); verify(interceptor).preProcess(this.asyncWebRequest, deferredResult); verify(interceptor).afterCompletion(this.asyncWebRequest, deferredResult); }
@SuppressWarnings("unchecked") @Test public void startDeferredResultProcessingBeforeConcurrentHandlingException() throws Exception { DeferredResult<Integer> deferredResult = new DeferredResult<>(); Exception exception = new Exception(); DeferredResultProcessingInterceptor interceptor = mock(DeferredResultProcessingInterceptor.class); willThrow(exception).given(interceptor).beforeConcurrentHandling(this.asyncWebRequest, deferredResult); this.asyncManager.registerDeferredResultInterceptor("interceptor", interceptor); try { this.asyncManager.startDeferredResultProcessing(deferredResult); fail("Expected Exception"); } catch (Exception success) { assertEquals(exception, success); } assertFalse(this.asyncManager.hasConcurrentResult()); verify(this.asyncWebRequest).addTimeoutHandler(notNull()); verify(this.asyncWebRequest).addErrorHandler(notNull()); verify(this.asyncWebRequest).addCompletionHandler(notNull()); }
@Test public void startDeferredResultProcessing() throws Exception { DeferredResult<String> deferredResult = new DeferredResult<>(1000L); String concurrentResult = "abc"; DeferredResultProcessingInterceptor interceptor = mock(DeferredResultProcessingInterceptor.class); setupDefaultAsyncScenario(); this.asyncManager.registerDeferredResultInterceptor("interceptor", interceptor); this.asyncManager.startDeferredResultProcessing(deferredResult); deferredResult.setResult(concurrentResult); assertEquals(concurrentResult, this.asyncManager.getConcurrentResult()); verifyDefaultAsyncScenario(); verify(interceptor).beforeConcurrentHandling(this.asyncWebRequest, deferredResult); verify(interceptor).preProcess(this.asyncWebRequest, deferredResult); verify(interceptor).postProcess(asyncWebRequest, deferredResult, concurrentResult); verify(this.asyncWebRequest).setTimeout(1000L); }