Skip to content

Commit cb93e25

Browse files
committed
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.
1 parent d836f68 commit cb93e25

File tree

2 files changed

+11
-3
lines changed

2 files changed

+11
-3
lines changed

spring-graphql/src/main/java/org/springframework/graphql/server/webmvc/GraphQlHttpHandler.java

Lines changed: 7 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,7 @@
1717
package org.springframework.graphql.server.webmvc;
1818

1919
import java.io.IOException;
20+
import java.time.Duration;
2021
import java.util.Arrays;
2122
import java.util.List;
2223
import java.util.Map;
@@ -106,7 +107,12 @@ public ServerResponse handleRequest(ServerRequest serverRequest) throws ServletE
106107
builder.headers(headers -> headers.putAll(response.getResponseHeaders()));
107108
builder.contentType(selectResponseMediaType(serverRequest));
108109
return builder.body(response.toMap());
109-
});
110+
})
111+
.cache();
112+
113+
try {
114+
return responseMono.block(Duration.ZERO);
115+
} catch (IllegalStateException ignored) {}
110116

111117
return ServerResponse.async(responseMono);
112118
}
@@ -138,5 +144,4 @@ private static MediaType selectResponseMediaType(ServerRequest serverRequest) {
138144
}
139145
return MediaType.APPLICATION_JSON;
140146
}
141-
142147
}

spring-graphql/src/test/java/org/springframework/graphql/server/webmvc/GraphQlHttpHandlerTests.java

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -122,7 +122,10 @@ private MockHttpServletResponse handleRequest(
122122
MockHttpServletRequest servletRequest, GraphQlHttpHandler handler) throws ServletException, IOException {
123123

124124
ServerRequest request = ServerRequest.create(servletRequest, MESSAGE_READERS);
125-
ServerResponse response = ((AsyncServerResponse) handler.handleRequest(request)).block();
125+
ServerResponse response = handler.handleRequest(request);
126+
if (response instanceof AsyncServerResponse asyncServerResponse) {
127+
asyncServerResponse.block();
128+
}
126129

127130
MockHttpServletResponse servletResponse = new MockHttpServletResponse();
128131
response.writeTo(servletRequest, servletResponse, new DefaultContext());

0 commit comments

Comments
 (0)