Skip to content

Commit 4f1f192

Browse files
committed
feat(server): Enhance McpHttpServer with graceful shutdown and test mode support
1 parent 2e79ee3 commit 4f1f192

File tree

2 files changed

+16
-8
lines changed

2 files changed

+16
-8
lines changed

src/main/java/com/github/codeboyzhou/mcp/declarative/server/McpHttpServer.java

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,8 @@
99
import org.slf4j.Logger;
1010
import org.slf4j.LoggerFactory;
1111

12+
import java.time.Duration;
13+
1214
public class McpHttpServer<T> {
1315

1416
private static final Logger logger = LoggerFactory.getLogger(McpHttpServer.class);
@@ -58,6 +60,8 @@ public void start() {
5860

5961
Server httpserver = new Server(serverInfo.port());
6062
httpserver.setHandler(handler);
63+
httpserver.setStopAtShutdown(true);
64+
httpserver.setStopTimeout(Duration.ofSeconds(5).getSeconds());
6165

6266
try {
6367
httpserver.start();
@@ -69,6 +73,13 @@ public void start() {
6973
// Add a shutdown hook to stop the HTTP server and MCP server gracefully
7074
addShutdownHook(httpserver);
7175

76+
// Check if the server is running in test mode
77+
final boolean testing = Boolean.parseBoolean(System.getProperty("mcp.declarative.java.sdk.testing"));
78+
if (testing) {
79+
logger.debug("Jetty-based HTTP server is running in test mode, not waiting for HTTP server to stop");
80+
return;
81+
}
82+
7283
// Wait for the HTTP server to stop
7384
httpserver.join();
7485
} catch (Exception e) {

src/test/java/com/github/codeboyzhou/mcp/declarative/McpServersTest.java

Lines changed: 5 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -59,14 +59,11 @@ void testStartSyncStdioServer() {
5959

6060
@Test
6161
void testStartSyncSseServer() {
62-
assertDoesNotThrow(() -> {
63-
Thread thread = new Thread(() -> {
64-
McpServers servers = McpServers.run(TestMcpComponentScanIsNull.class, EMPTY_ARGS);
65-
servers.startSyncSseServer("test-mcp-sync-sse-server", "1.0.0");
66-
});
67-
thread.setDaemon(true);
68-
thread.start();
69-
});
62+
System.setProperty("mcp.declarative.java.sdk.testing", "true");
63+
McpServers servers = McpServers.run(TestMcpComponentScanIsNull.class, EMPTY_ARGS);
64+
assertDoesNotThrow(() -> servers.startSyncSseServer("test-mcp-sync-sse-server", "1.0.0"));
65+
assertDoesNotThrow(() -> servers.startSyncSseServer("test-mcp-sync-sse-server", "1.0.0", 9118));
66+
assertDoesNotThrow(() -> servers.startSyncSseServer("test-mcp-sync-sse-server", "1.0.0", "/message", "/sse", 9119));
7067
}
7168

7269
private Reflections getReflectionsField() throws NoSuchFieldException, IllegalAccessException {

0 commit comments

Comments
 (0)