private DeferredResult<Object> adaptListenableFuture(ListenableFuture<?> future) { DeferredResult<Object> result = new DeferredResult<>(); future.addCallback(new ListenableFutureCallback<Object>() { @Override public void onSuccess(@Nullable Object value) { result.setResult(value); } @Override public void onFailure(Throwable ex) { result.setErrorResult(ex); } }); return result; }
@RequestMapping(params = "deferredResult") public DeferredResult<Person> getDeferredResult() { DeferredResult<Person> deferredResult = new DeferredResult<>(); this.deferredResults.add(deferredResult); return deferredResult; }
private DeferredResult<Object> adaptCompletionStage(CompletionStage<?> future) { DeferredResult<Object> result = new DeferredResult<>(); future.handle((BiFunction<Object, Throwable, Object>) (value, ex) -> { if (ex != null) { result.setErrorResult(ex); } else { result.setResult(value); } return null; }); return result; }
@RequestMapping(params = "deferredResultWithDelayedError") public DeferredResult<Person> getDeferredResultWithDelayedError() { final DeferredResult<Person> deferredResult = new DeferredResult<>(); new Thread() { public void run() { try { Thread.sleep(100); deferredResult.setErrorResult(new RuntimeException("Delayed Error")); } catch (InterruptedException e) { /* no-op */ } } }.start(); return deferredResult; }
@RequestMapping(params = "deferredResultWithImmediateValue") public DeferredResult<Person> getDeferredResultWithImmediateValue() { DeferredResult<Person> deferredResult = new DeferredResult<>(); deferredResult.setResult(new Person("Joe")); return deferredResult; }
@Test public void deferredResult() throws Exception { DeferredResult<String> result = new DeferredResult<>(); IllegalStateException ex = new IllegalStateException(); testHandle(result, DeferredResult.class, () -> result.setErrorResult(ex), ex); }
@Test public void deferredResultWithError() throws Exception { DeferredResult<String> result = new DeferredResult<>(); testHandle(result, DeferredResult.class, () -> result.setResult("foo"), "foo"); }
@Test public void setResult() { DeferredResultHandler handler = mock(DeferredResultHandler.class); DeferredResult<String> result = new DeferredResult<>(); result.setResultHandler(handler); assertTrue(result.setResult("hello")); verify(handler).handleResult("hello"); }
@Test public void setResultTwice() { DeferredResultHandler handler = mock(DeferredResultHandler.class); DeferredResult<String> result = new DeferredResult<>(); result.setResultHandler(handler); assertTrue(result.setResult("hello")); assertFalse(result.setResult("hi")); verify(handler).handleResult("hello"); }
@Test public void isSetOrExpired() { DeferredResultHandler handler = mock(DeferredResultHandler.class); DeferredResult<String> result = new DeferredResult<>(); result.setResultHandler(handler); assertFalse(result.isSetOrExpired()); result.setResult("hello"); assertTrue(result.isSetOrExpired()); verify(handler).handleResult("hello"); }
@Test public void onCompletion() throws Exception { final StringBuilder sb = new StringBuilder(); DeferredResult<String> result = new DeferredResult<>(); result.onCompletion(new Runnable() { @Override public void run() { sb.append("completion event"); } }); result.getInterceptor().afterCompletion(null, null); assertTrue(result.isSetOrExpired()); assertEquals("completion event", sb.toString()); }
@Test public void hasResult() { DeferredResultHandler handler = mock(DeferredResultHandler.class); DeferredResult<String> result = new DeferredResult<>(); result.setResultHandler(handler); assertFalse(result.hasResult()); assertNull(result.getResult()); result.setResult("hello"); assertEquals("hello", result.getResult()); }
@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 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 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 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 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); }