From cb93e252466d650d1626e69157db6fd9a4ea20b4 Mon Sep 17 00:00:00 2001 From: Patrick Strawderman Date: Wed, 7 Feb 2024 14:24:49 -0800 Subject: [PATCH] Avoid unnecessary async handling in GraphQlHttpHandler In the webmvc GraphQlHttpHandler, return the server response directly if the WebGraphQlHandler returns an already completed Mono. This avoids some extra overhead incurred with async processing. --- .../graphql/server/webmvc/GraphQlHttpHandler.java | 9 +++++++-- .../graphql/server/webmvc/GraphQlHttpHandlerTests.java | 5 ++++- 2 files changed, 11 insertions(+), 3 deletions(-) diff --git a/spring-graphql/src/main/java/org/springframework/graphql/server/webmvc/GraphQlHttpHandler.java b/spring-graphql/src/main/java/org/springframework/graphql/server/webmvc/GraphQlHttpHandler.java index fb7c630d0..518b85a44 100644 --- a/spring-graphql/src/main/java/org/springframework/graphql/server/webmvc/GraphQlHttpHandler.java +++ b/spring-graphql/src/main/java/org/springframework/graphql/server/webmvc/GraphQlHttpHandler.java @@ -17,6 +17,7 @@ package org.springframework.graphql.server.webmvc; import java.io.IOException; +import java.time.Duration; import java.util.Arrays; import java.util.List; import java.util.Map; @@ -106,7 +107,12 @@ public ServerResponse handleRequest(ServerRequest serverRequest) throws ServletE builder.headers(headers -> headers.putAll(response.getResponseHeaders())); builder.contentType(selectResponseMediaType(serverRequest)); return builder.body(response.toMap()); - }); + }) + .cache(); + + try { + return responseMono.block(Duration.ZERO); + } catch (IllegalStateException ignored) {} return ServerResponse.async(responseMono); } @@ -138,5 +144,4 @@ private static MediaType selectResponseMediaType(ServerRequest serverRequest) { } return MediaType.APPLICATION_JSON; } - } diff --git a/spring-graphql/src/test/java/org/springframework/graphql/server/webmvc/GraphQlHttpHandlerTests.java b/spring-graphql/src/test/java/org/springframework/graphql/server/webmvc/GraphQlHttpHandlerTests.java index 19ee887ed..79c0b3893 100644 --- a/spring-graphql/src/test/java/org/springframework/graphql/server/webmvc/GraphQlHttpHandlerTests.java +++ b/spring-graphql/src/test/java/org/springframework/graphql/server/webmvc/GraphQlHttpHandlerTests.java @@ -122,7 +122,10 @@ private MockHttpServletResponse handleRequest( MockHttpServletRequest servletRequest, GraphQlHttpHandler handler) throws ServletException, IOException { ServerRequest request = ServerRequest.create(servletRequest, MESSAGE_READERS); - ServerResponse response = ((AsyncServerResponse) handler.handleRequest(request)).block(); + ServerResponse response = handler.handleRequest(request); + if (response instanceof AsyncServerResponse asyncServerResponse) { + asyncServerResponse.block(); + } MockHttpServletResponse servletResponse = new MockHttpServletResponse(); response.writeTo(servletRequest, servletResponse, new DefaultContext());