Код: Выделить всё
@Service
public class McpWeatherService {
@Tool(description = "根据城市名称获取天气预报")
public String getWeatherByCity(String city) {
Map mockData = Map.of(
"西安", "晴天",
"北京", "小雨",
"上海", "大雨"
);
return mockData.getOrDefault(city, "抱歉:未查询到对应城市!");
}
}
< /code>
mcp -сервер config: < /p>
@Configuration
public class McpServerConfig {
@Bean
public ToolCallbackProvider weatherTools(McpWeatherService weatherService) {
return MethodToolCallbackProvider.builder().toolObjects(weatherService).build();
}
@Bean
public WebClient.Builder webClientBuilder() {
return WebClient.builder();
}
}
< /code>
Я запускаю клиента, затем вызову запрос Generate, успех в первый раз, примерно через 20 секунд, он не удался, когда я вызову второй раз, журнал сервера: < /p>
2025-04-09T11:55:01.101+08:00 DEBUG 33552 --- [bao-ai-mcp] [ XNIO-1 task-2] o.s.web.servlet.DispatcherServlet : POST "/mcp/message", parameters={}
2025-04-09T11:55:01.102+08:00 DEBUG 33552 --- [bao-ai-mcp] [ XNIO-1 task-2] o.s.w.s.f.support.RouterFunctionMapping : Mapped to io.modelcontextprotocol.server.transport.WebMvcSseServerTransport$$Lambda$863/0x000000080109d548@7d01533b
2025-04-09T11:55:01.104+08:00 DEBUG 33552 --- [bao-ai-mcp] [ XNIO-1 task-2] o.s.web.servlet.DispatcherServlet : Completed 200 OK
2025-04-09T11:55:01.104+08:00 DEBUG 33552 --- [bao-ai-mcp] [oundedElastic-1] i.m.s.t.WebMvcSseServerTransport : Attempting to broadcast message to 1 active sessions
2025-04-09T11:55:03.555+08:00 DEBUG 33552 --- [bao-ai-mcp] [ XNIO-1 task-2] o.s.w.c.request.async.WebAsyncManager : Servlet container timeout notification for "/sse"
2025-04-09T11:55:03.555+08:00 DEBUG 33552 --- [bao-ai-mcp] [ XNIO-1 task-2] o.s.w.c.request.async.WebAsyncManager : Async result set for "/sse"
2025-04-09T11:55:03.555+08:00 DEBUG 33552 --- [bao-ai-mcp] [ XNIO-1 task-2] o.s.w.c.request.async.WebAsyncManager : Performing async dispatch for "/sse"
2025-04-09T11:55:03.557+08:00 DEBUG 33552 --- [bao-ai-mcp] [ XNIO-1 task-3] o.s.web.servlet.DispatcherServlet : "ASYNC" dispatch for GET "/sse", parameters={}
2025-04-09T11:55:03.558+08:00 DEBUG 33552 --- [bao-ai-mcp] [ XNIO-1 task-3] o.s.w.s.f.s.HandlerFunctionAdapter : Resume with async result [org.springframework.web.context.request.async.AsyncRequestTimeoutException]
2025-04-09T11:55:03.560+08:00 WARN 33552 --- [bao-ai-mcp] [ XNIO-1 task-3] .w.s.m.s.DefaultHandlerExceptionResolver : Ignoring exception, response committed already: org.springframework.web.context.request.async.AsyncRequestTimeoutException
2025-04-09T11:55:03.560+08:00 WARN 33552 --- [bao-ai-mcp] [ XNIO-1 task-3] .w.s.m.s.DefaultHandlerExceptionResolver : Resolved [org.springframework.web.context.request.async.AsyncRequestTimeoutException]
2025-04-09T11:55:03.562+08:00 DEBUG 33552 --- [bao-ai-mcp] [ XNIO-1 task-3] o.s.web.servlet.DispatcherServlet : Exiting from "ASYNC" dispatch, status 200
2025-04-09T11:55:17.928+08:00 DEBUG 33552 --- [bao-ai-mcp] [ XNIO-1 task-3] o.s.web.servlet.DispatcherServlet : POST "/mcp/message", parameters={}
2025-04-09T11:55:17.928+08:00 DEBUG 33552 --- [bao-ai-mcp] [ XNIO-1 task-3] o.s.w.s.f.support.RouterFunctionMapping : Mapped to io.modelcontextprotocol.server.transport.WebMvcSseServerTransport$$Lambda$863/0x000000080109d548@7d01533b
2025-04-09T11:55:17.928+08:00 DEBUG 33552 --- [bao-ai-mcp] [ XNIO-1 task-3] i.m.s.t.WebMvcSseServerTransport : Attempting to broadcast message to 1 active sessions
2025-04-09T11:55:17.930+08:00 ERROR 33552 --- [bao-ai-mcp] [ XNIO-1 task-3] i.m.s.t.WebMvcSseServerTransport : Failed to send message to session b6531a60-1d18-472f-a1f9-c54ce74cfb55: ServletOutputStream failed to write: UT010029: Stream is closed
2025-04-09T11:55:17.930+08:00 DEBUG 33552 --- [bao-ai-mcp] [ XNIO-1 task-3] o.s.web.servlet.DispatcherServlet : Completed 200 OK
< /code>
Клиент выполняет журнал исключений: < /p>
Caused by: java.util.concurrent.TimeoutException: Did not observe any item or terminal signal within 20000ms in 'Mono.create ⇢ at io.modelcontextprotocol.spec.DefaultMcpSession.sendRequest(DefaultMcpSession.java:228)' (and no fallback has been configured)
at reactor.core.publisher.FluxTimeout$TimeoutMainSubscriber.handleTimeout(FluxTimeout.java:296)
Suppressed: reactor.core.publisher.FluxOnAssembly$OnAssemblyException:
Assembly trace from producer [reactor.core.publisher.MonoTimeout] :
reactor.core.publisher.Mono.timeout(Mono.java:5008)
io.modelcontextprotocol.spec.DefaultMcpSession.sendRequest(DefaultMcpSession.java:239)
Error has been observed at the following site(s):
*__Mono.timeout ⇢ at io.modelcontextprotocol.spec.DefaultMcpSession.sendRequest(DefaultMcpSession.java:239)
|_ Mono.handle ⇢ at io.modelcontextprotocol.spec.DefaultMcpSession.sendRequest(DefaultMcpSession.java:239)
Original Stack Trace:
at reactor.core.publisher.FluxTimeout$TimeoutMainSubscriber.handleTimeout(FluxTimeout.java:296)
at reactor.core.publisher.FluxTimeout$TimeoutMainSubscriber.doTimeout(FluxTimeout.java:281)
at reactor.core.publisher.FluxTimeout$TimeoutTimeoutSubscriber.onNext(FluxTimeout.java:420)
at reactor.core.publisher.FluxOnErrorReturn$ReturnSubscriber.onNext(FluxOnErrorReturn.java:162)
at reactor.core.publisher.MonoDelay$MonoDelayRunnable.propagateDelay(MonoDelay.java:270)
at reactor.core.publisher.MonoDelay$MonoDelayRunnable.run(MonoDelay.java:285)
at reactor.core.scheduler.SchedulerTask.call(SchedulerTask.java:68)
at reactor.core.scheduler.SchedulerTask.call(SchedulerTask.java:28)
at java.base/java.util.concurrent.FutureTask.run$$$capture(FutureTask.java:264)
at java.base/java.util.concurrent.FutureTask.run(FutureTask.java)
at java.base/java.util.concurrent.ScheduledThreadPoolExecutor$ScheduledFutureTask.run(ScheduledThreadPoolExecutor.java:304)
at java.base/java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1136)
at java.base/java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:635)
at java.base/java.lang.Thread.run(Thread.java:833)
Creating a new SqlSession
Закрывает ли сеанс сервера MCP Auto через 20 секунд?>
Подробнее здесь: https://stackoverflow.com/questions/795 ... to-session