Răsfoiți Sursa

mvc线程池

liuchengsen 3 săptămâni în urmă
părinte
comite
e1915e367c

+ 35 - 0
backend-java/src/main/java/com/pharmacopoeia/config/WebMvcAsyncConfig.java

@@ -0,0 +1,35 @@
+package com.pharmacopoeia.config;
+
+import org.springframework.context.annotation.Configuration;
+import org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor;
+import org.springframework.web.servlet.config.annotation.AsyncSupportConfigurer;
+import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;
+
+import java.util.concurrent.ThreadPoolExecutor;
+
+/**
+ * Spring MVC 异步支持配置:为流式 SSE 返回(Flux<ServerSentEvent>)提供线程池,
+ * 替换默认的 SimpleAsyncTaskExecutor(每请求新建线程,生产负载下不适用)。
+ * LLM 流式可能持续数秒到数十秒,每个流式请求在生命周期内占用一个 async 线程,
+ * 因此池容量按并发流式用户数估算。
+ */
+@Configuration
+public class WebMvcAsyncConfig implements WebMvcConfigurer {
+
+    @Override
+    public void configureAsyncSupport(AsyncSupportConfigurer configurer) {
+        ThreadPoolTaskExecutor executor = new ThreadPoolTaskExecutor();
+        executor.setThreadNamePrefix("mvc-async-");
+        executor.setCorePoolSize(20);
+        executor.setMaxPoolSize(100);
+        executor.setQueueCapacity(500);
+        executor.setKeepAliveSeconds(60);
+        executor.setRejectedExecutionHandler(new ThreadPoolExecutor.CallerRunsPolicy());
+        executor.setWaitForTasksToCompleteOnShutdown(true);
+        executor.setAwaitTerminationSeconds(30);
+        executor.initialize();
+        configurer.setTaskExecutor(executor);
+        // 流式上限(L1~2s、L2思考~20-30s),给 120s 余量,避免误杀长流
+        configurer.setDefaultTimeout(120000L);
+    }
+}