Cancel WebAsyncManager thread on request timeout

Issue: SPR-15852
This commit is contained in:
Rossen Stoyanchev
2017-08-16 09:42:39 +02:00
parent 8b64ad3192
commit 681ced8fd3
3 changed files with 56 additions and 4 deletions

View File

@@ -17,6 +17,7 @@
package org.springframework.web.context.request.async;
import java.util.concurrent.Callable;
import java.util.concurrent.Future;
import javax.servlet.AsyncEvent;
import org.junit.Before;
@@ -28,9 +29,15 @@ import org.springframework.mock.web.test.MockHttpServletRequest;
import org.springframework.mock.web.test.MockHttpServletResponse;
import org.springframework.web.context.request.NativeWebRequest;
import static org.junit.Assert.*;
import static org.mockito.BDDMockito.*;
import static org.springframework.web.context.request.async.CallableProcessingInterceptor.*;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertTrue;
import static org.mockito.BDDMockito.any;
import static org.mockito.BDDMockito.given;
import static org.mockito.BDDMockito.mock;
import static org.mockito.BDDMockito.verify;
import static org.mockito.BDDMockito.verifyNoMoreInteractions;
import static org.mockito.BDDMockito.when;
import static org.springframework.web.context.request.async.CallableProcessingInterceptor.RESULT_NONE;
/**
* {@link WebAsyncManager} tests where container-triggered timeout/completion
@@ -148,6 +155,27 @@ public class WebAsyncManagerTimeoutTests {
verify(interceptor).beforeConcurrentHandling(this.asyncWebRequest, callable);
}
@SuppressWarnings("unchecked")
@Test
public void startCallableProcessingTimeoutAndCheckThreadInterrupted() throws Exception {
StubCallable callable = new StubCallable();
Future future = mock(Future.class);
AsyncTaskExecutor executor = mock(AsyncTaskExecutor.class);
when(executor.submit(any(Runnable.class))).thenReturn(future);
this.asyncManager.setTaskExecutor(executor);
this.asyncManager.startCallableProcessing(callable);
this.asyncWebRequest.onTimeout(ASYNC_EVENT);
assertTrue(this.asyncManager.hasConcurrentResult());
verify(future).cancel(true);
verifyNoMoreInteractions(future);
}
@Test
public void startDeferredResultProcessingTimeoutAndComplete() throws Exception {