From a67d80b2187a6a90ab55f2839a2c04a34eab9255 Mon Sep 17 00:00:00 2001 From: Oleg Zhurakousky Date: Wed, 14 Jun 2023 16:47:24 +0200 Subject: [PATCH] Clean up async execution logic in ProxyMVC --- .../web/ProxyHttpServletRequest.java | 1 + .../function/serverless/web/ProxyMvc.java | 21 +++++++++++++------ 2 files changed, 16 insertions(+), 6 deletions(-) diff --git a/spring-cloud-function-adapters/spring-cloud-function-serverless-web/src/main/java/org/springframework/cloud/function/serverless/web/ProxyHttpServletRequest.java b/spring-cloud-function-adapters/spring-cloud-function-serverless-web/src/main/java/org/springframework/cloud/function/serverless/web/ProxyHttpServletRequest.java index e669d4226..3be55e479 100644 --- a/spring-cloud-function-adapters/spring-cloud-function-serverless-web/src/main/java/org/springframework/cloud/function/serverless/web/ProxyHttpServletRequest.java +++ b/spring-cloud-function-adapters/spring-cloud-function-serverless-web/src/main/java/org/springframework/cloud/function/serverless/web/ProxyHttpServletRequest.java @@ -634,6 +634,7 @@ public class ProxyHttpServletRequest implements HttpServletRequest { @Override public AsyncContext startAsync(ServletRequest request, @Nullable ServletResponse response) { Assert.state(this.asyncSupported, "Async not supported"); + this.dispatcherType = DispatcherType.ASYNC; this.asyncStarted = true; this.asyncContext = this.asyncContext == null ? new ProxyAsyncContext(request, response) : this.asyncContext; return this.asyncContext; diff --git a/spring-cloud-function-adapters/spring-cloud-function-serverless-web/src/main/java/org/springframework/cloud/function/serverless/web/ProxyMvc.java b/spring-cloud-function-adapters/spring-cloud-function-serverless-web/src/main/java/org/springframework/cloud/function/serverless/web/ProxyMvc.java index abb7850ec..bafa5c909 100644 --- a/spring-cloud-function-adapters/spring-cloud-function-serverless-web/src/main/java/org/springframework/cloud/function/serverless/web/ProxyMvc.java +++ b/spring-cloud-function-adapters/spring-cloud-function-serverless-web/src/main/java/org/springframework/cloud/function/serverless/web/ProxyMvc.java @@ -25,6 +25,7 @@ import java.util.Iterator; import java.util.List; import java.util.concurrent.CountDownLatch; +import jakarta.servlet.AsyncContext; import jakarta.servlet.Filter; import jakarta.servlet.FilterChain; import jakarta.servlet.FilterConfig; @@ -49,8 +50,6 @@ import org.springframework.util.Assert; import org.springframework.util.ObjectUtils; import org.springframework.util.StringUtils; import org.springframework.web.context.ConfigurableWebApplicationContext; -import org.springframework.web.context.request.async.WebAsyncManager; -import org.springframework.web.context.request.async.WebAsyncUtils; import org.springframework.web.servlet.DispatcherServlet; /** @@ -143,15 +142,25 @@ public final class ProxyMvc { public void service(HttpServletRequest request, HttpServletResponse response, CountDownLatch latch) throws Exception { + ((ProxyHttpServletRequest) request).setAsyncStarted(true); + ProxyFilterChain filterChain = new ProxyFilterChain(this.dispatcher); filterChain.doFilter(request, response); - WebAsyncManager asyncManager = WebAsyncUtils.getAsyncManager(request); - if (asyncManager.isConcurrentHandlingStarted()) { - this.dispatcher.service(request, response); + AsyncContext asyncContext = request.getAsyncContext(); + if (asyncContext != null) { + filterChain = new ProxyFilterChain(this.dispatcher); + ((ProxyAsyncContext) asyncContext).addDispatchHandler(() -> { + try { + new ProxyFilterChain(this.dispatcher).doFilter(request, response); + asyncContext.complete(); + } + catch (Exception e) { + throw new IllegalStateException(e); + } + }); } - if (latch != null) { latch.countDown(); }