From f087525a758eeed60a841b95015af4e6fd9dfacf Mon Sep 17 00:00:00 2001 From: JEECG <445654970@qq.com> Date: Sun, 14 Sep 2025 10:40:21 +0800 Subject: [PATCH] =?UTF-8?q?=E3=80=90v3.8.3=E3=80=91undertow=E4=B8=8D?= =?UTF-8?q?=E7=A8=B3=E5=AE=9A=E5=88=87=E6=8D=A2=E5=9B=9Etomcat?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../config/init/ShiroCacheClearRunner.java | 2 +- .../config/init/TomcatFactoryConfig.java | 66 +++---- .../config/init/UndertowConfiguration.java | 96 +++++----- .../CustomUndertowMetricsHandler.java | 178 +++++++++--------- 4 files changed, 170 insertions(+), 172 deletions(-) diff --git a/jeecg-boot/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/config/init/ShiroCacheClearRunner.java b/jeecg-boot/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/config/init/ShiroCacheClearRunner.java index 7c4bfe11c..dee91c0b5 100644 --- a/jeecg-boot/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/config/init/ShiroCacheClearRunner.java +++ b/jeecg-boot/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/config/init/ShiroCacheClearRunner.java @@ -23,7 +23,7 @@ public class ShiroCacheClearRunner implements ApplicationRunner { @Override public void run(ApplicationArguments args) { // 清空所有授权redis缓存 - log.info("———————清空所有用户授权缓存———————clearAllCache——————— "); + log.info("——— Service restart, clearing all user shiro authorization cache ——— "); redisUtil.removeAll(CommonConstant.PREFIX_USER_SHIRO_CACHE); } diff --git a/jeecg-boot/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/config/init/TomcatFactoryConfig.java b/jeecg-boot/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/config/init/TomcatFactoryConfig.java index 4406122d0..ac4d2a5b4 100644 --- a/jeecg-boot/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/config/init/TomcatFactoryConfig.java +++ b/jeecg-boot/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/config/init/TomcatFactoryConfig.java @@ -1,33 +1,33 @@ -//package org.jeecg.config.init; -// -//import org.apache.catalina.Context; -//import org.apache.tomcat.util.scan.StandardJarScanner; -//import org.springframework.boot.web.embedded.tomcat.TomcatServletWebServerFactory; -//import org.springframework.context.annotation.Bean; -//import org.springframework.context.annotation.Configuration; -// -///** -// * @Description: TomcatFactoryConfig -// * @author: scott -// * @date: 2021年01月25日 11:40 -// */ -//@Configuration -//public class TomcatFactoryConfig { -// /** -// * tomcat-embed-jasper引用后提示jar找不到的问题 -// */ -// @Bean -// public TomcatServletWebServerFactory tomcatFactory() { -// TomcatServletWebServerFactory factory = new TomcatServletWebServerFactory() { -// @Override -// protected void postProcessContext(Context context) { -// ((StandardJarScanner) context.getJarScanner()).setScanManifest(false); -// } -// }; -// factory.addConnectorCustomizers(connector -> { -// connector.setProperty("relaxedPathChars", "[]{}"); -// connector.setProperty("relaxedQueryChars", "[]{}"); -// }); -// return factory; -// } -//} +package org.jeecg.config.init; + +import org.apache.catalina.Context; +import org.apache.tomcat.util.scan.StandardJarScanner; +import org.springframework.boot.web.embedded.tomcat.TomcatServletWebServerFactory; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; + +/** + * @Description: TomcatFactoryConfig + * @author: scott + * @date: 2021年01月25日 11:40 + */ +@Configuration +public class TomcatFactoryConfig { + /** + * tomcat-embed-jasper引用后提示jar找不到的问题 + */ + @Bean + public TomcatServletWebServerFactory tomcatFactory() { + TomcatServletWebServerFactory factory = new TomcatServletWebServerFactory() { + @Override + protected void postProcessContext(Context context) { + ((StandardJarScanner) context.getJarScanner()).setScanManifest(false); + } + }; + factory.addConnectorCustomizers(connector -> { + connector.setProperty("relaxedPathChars", "[]{}"); + connector.setProperty("relaxedQueryChars", "[]{}"); + }); + return factory; + } +} diff --git a/jeecg-boot/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/config/init/UndertowConfiguration.java b/jeecg-boot/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/config/init/UndertowConfiguration.java index 77b732c47..103928d59 100644 --- a/jeecg-boot/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/config/init/UndertowConfiguration.java +++ b/jeecg-boot/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/config/init/UndertowConfiguration.java @@ -1,48 +1,48 @@ -package org.jeecg.config.init; - -import io.undertow.UndertowOptions; -import io.undertow.server.DefaultByteBufferPool; -import io.undertow.server.handlers.BlockingHandler; -import io.undertow.websockets.jsr.WebSocketDeploymentInfo; -import org.jeecg.modules.monitor.actuator.undertow.CustomUndertowMetricsHandler; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.boot.web.embedded.undertow.UndertowServletWebServerFactory; -import org.springframework.boot.web.server.WebServerFactoryCustomizer; -import org.springframework.context.annotation.Configuration; - -/** - * Undertow配置 - * - * 解决启动提示: WARN io.undertow.websockets.jsr:68 - UT026010: Buffer pool was not set on WebSocketDeploymentInfo, the default pool will be used - */ -@Configuration -public class UndertowConfiguration implements WebServerFactoryCustomizer { - - /** - * 自定义undertow监控指标工具类 - * for [QQYUN-11902]tomcat 替换undertow 这里的功能还没修改 - */ - @Autowired - private CustomUndertowMetricsHandler customUndertowMetricsHandler; - - @Override - public void customize(UndertowServletWebServerFactory factory) { - // 设置 Undertow 服务器参数(底层网络配置) - factory.addBuilderCustomizers(builder -> { - builder.setServerOption(UndertowOptions.MAX_HEADER_SIZE, 65536); // header 最大64KB - builder.setServerOption(UndertowOptions.MAX_PARAMETERS, 10000); // 最大参数数 - }); - factory.addDeploymentInfoCustomizers(deploymentInfo -> { - - WebSocketDeploymentInfo webSocketDeploymentInfo = new WebSocketDeploymentInfo(); - - // 设置合理的参数 - webSocketDeploymentInfo.setBuffers(new DefaultByteBufferPool(true, 8192)); - - deploymentInfo.addServletContextAttribute("io.undertow.websockets.jsr.WebSocketDeploymentInfo", webSocketDeploymentInfo); - - // 添加自定义 监控 handler - deploymentInfo.addInitialHandlerChainWrapper(next -> new BlockingHandler(customUndertowMetricsHandler.wrap(next))); - }); - } -} \ No newline at end of file +//package org.jeecg.config.init; +// +//import io.undertow.UndertowOptions; +//import io.undertow.server.DefaultByteBufferPool; +//import io.undertow.server.handlers.BlockingHandler; +//import io.undertow.websockets.jsr.WebSocketDeploymentInfo; +//import org.jeecg.modules.monitor.actuator.undertow.CustomUndertowMetricsHandler; +//import org.springframework.beans.factory.annotation.Autowired; +//import org.springframework.boot.web.embedded.undertow.UndertowServletWebServerFactory; +//import org.springframework.boot.web.server.WebServerFactoryCustomizer; +//import org.springframework.context.annotation.Configuration; +// +///** +// * Undertow配置 +// * +// * 解决启动提示: WARN io.undertow.websockets.jsr:68 - UT026010: Buffer pool was not set on WebSocketDeploymentInfo, the default pool will be used +// */ +//@Configuration +//public class UndertowConfiguration implements WebServerFactoryCustomizer { +// +// /** +// * 自定义undertow监控指标工具类 +// * for [QQYUN-11902]tomcat 替换undertow 这里的功能还没修改 +// */ +// @Autowired +// private CustomUndertowMetricsHandler customUndertowMetricsHandler; +// +// @Override +// public void customize(UndertowServletWebServerFactory factory) { +// // 设置 Undertow 服务器参数(底层网络配置) +// factory.addBuilderCustomizers(builder -> { +// builder.setServerOption(UndertowOptions.MAX_HEADER_SIZE, 65536); // header 最大64KB +// builder.setServerOption(UndertowOptions.MAX_PARAMETERS, 10000); // 最大参数数 +// }); +// factory.addDeploymentInfoCustomizers(deploymentInfo -> { +// +// WebSocketDeploymentInfo webSocketDeploymentInfo = new WebSocketDeploymentInfo(); +// +// // 设置合理的参数 +// webSocketDeploymentInfo.setBuffers(new DefaultByteBufferPool(true, 8192)); +// +// deploymentInfo.addServletContextAttribute("io.undertow.websockets.jsr.WebSocketDeploymentInfo", webSocketDeploymentInfo); +// +// // 添加自定义 监控 handler +// deploymentInfo.addInitialHandlerChainWrapper(next -> new BlockingHandler(customUndertowMetricsHandler.wrap(next))); +// }); +// } +//} \ No newline at end of file diff --git a/jeecg-boot/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/monitor/actuator/undertow/CustomUndertowMetricsHandler.java b/jeecg-boot/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/monitor/actuator/undertow/CustomUndertowMetricsHandler.java index f80e20a79..a521c46a9 100644 --- a/jeecg-boot/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/monitor/actuator/undertow/CustomUndertowMetricsHandler.java +++ b/jeecg-boot/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/monitor/actuator/undertow/CustomUndertowMetricsHandler.java @@ -1,90 +1,88 @@ -package org.jeecg.modules.monitor.actuator.undertow; - -import io.micrometer.core.instrument.MeterRegistry; -import io.undertow.server.HttpHandler; -import io.undertow.server.HttpServerExchange; -import io.undertow.server.session.*; -import org.springframework.stereotype.Component; - -import java.util.concurrent.atomic.AtomicInteger; -import java.util.concurrent.atomic.LongAdder; - -/** - * 自定义undertow监控指标工具类 - * for [QQYUN-11902]tomcat 替换undertow 这里的功能还没修改 - * @author chenrui - * @date 2025/4/8 19:06 - */ -@Component("jeecgCustomUndertowMetricsHandler") -public class CustomUndertowMetricsHandler { - - // 用于统计已创建的 session 数量 - private final LongAdder sessionsCreated = new LongAdder(); - - // 用于统计已销毁的 session 数量 - private final LongAdder sessionsExpired = new LongAdder(); - - // 当前活跃的 session 数量 - private final AtomicInteger activeSessions = new AtomicInteger(); - - // 历史最大活跃 session 数 - private final AtomicInteger maxActiveSessions = new AtomicInteger(); - - // Undertow 内存 session 管理器(用于创建与管理 session) - private final InMemorySessionManager sessionManager = new InMemorySessionManager("undertow-session-manager"); - - // 使用 Cookie 存储 session ID - private final SessionConfig sessionConfig = new SessionCookieConfig(); - - /** - * 构造函数 - * @param meterRegistry - * @author chenrui - * @date 2025/4/8 19:07 - */ - public CustomUndertowMetricsHandler(MeterRegistry meterRegistry) { - // 注册 Micrometer 指标 - meterRegistry.gauge("undertow.sessions.created", sessionsCreated, LongAdder::longValue); - meterRegistry.gauge("undertow.sessions.expired", sessionsExpired, LongAdder::longValue); - meterRegistry.gauge("undertow.sessions.active.current", activeSessions, AtomicInteger::get); - meterRegistry.gauge("undertow.sessions.active.max", maxActiveSessions, AtomicInteger::get); - - // 添加 session 生命周期监听器,统计 session 创建与销毁 - sessionManager.registerSessionListener(new SessionListener() { - @Override - public void sessionCreated(Session session, HttpServerExchange exchange) { - sessionsCreated.increment(); - int now = activeSessions.incrementAndGet(); - maxActiveSessions.getAndUpdate(max -> Math.max(max, now)); - } - - @Override - public void sessionDestroyed(Session session, HttpServerExchange exchange, SessionDestroyedReason reason) { - sessionsExpired.increment(); - activeSessions.decrementAndGet(); - } - }); - } - - /** - * 包装 Undertow 的 HttpHandler,实现 session 自动创建逻辑 - * @param next - * @return - * @author chenrui - * @date 2025/4/8 19:07 - */ - public HttpHandler wrap(HttpHandler next) { - return exchange -> { - // 获取当前 session,如果不存在则创建 - Session session = sessionManager.getSession(exchange, sessionConfig); - if (session == null) { - try { - sessionManager.createSession(exchange, sessionConfig); - } catch (Exception e) {} - } - - // 执行下一个 Handler - next.handleRequest(exchange); - }; - } -} \ No newline at end of file +//package org.jeecg.modules.monitor.actuator.undertow; +// +//import io.micrometer.core.instrument.MeterRegistry; +//import io.undertow.server.HttpHandler; +//import io.undertow.server.HttpServerExchange; +//import io.undertow.server.session.*; +//import org.springframework.stereotype.Component; +// +//import java.util.concurrent.atomic.AtomicInteger; +//import java.util.concurrent.atomic.LongAdder; +// +///** +// * 自定义undertow监控指标工具类 +// * for [QQYUN-11902]tomcat 替换undertow 这里的功能还没修改 +// * @author chenrui +// * @date 2025/4/8 19:06 +// */ +//@Component("jeecgCustomUndertowMetricsHandler") +//public class CustomUndertowMetricsHandler { +// +// // 用于统计已创建的 session 数量 +// private final LongAdder sessionsCreated = new LongAdder(); +// +// // 用于统计已销毁的 session 数量 +// private final LongAdder sessionsExpired = new LongAdder(); +// +// // 当前活跃的 session 数量 +// private final AtomicInteger activeSessions = new AtomicInteger(); +// +// // 历史最大活跃 session 数 +// private final AtomicInteger maxActiveSessions = new AtomicInteger(); +// +// // Undertow 内存 session 管理器(用于创建与管理 session) +// private final InMemorySessionManager sessionManager = new InMemorySessionManager("undertow-session-manager"); +// +// // 使用 Cookie 存储 session ID +// private final SessionConfig sessionConfig = new SessionCookieConfig(); +// +// /** +// * 构造函数 +// * @param meterRegistry +// * @author chenrui +// * @date 2025/4/8 19:07 +// */ +// public CustomUndertowMetricsHandler(MeterRegistry meterRegistry) { +// // 注册 Micrometer 指标 +// meterRegistry.gauge("undertow.sessions.created", sessionsCreated, LongAdder::longValue); +// meterRegistry.gauge("undertow.sessions.expired", sessionsExpired, LongAdder::longValue); +// meterRegistry.gauge("undertow.sessions.active.current", activeSessions, AtomicInteger::get); +// meterRegistry.gauge("undertow.sessions.active.max", maxActiveSessions, AtomicInteger::get); +// +// // 添加 session 生命周期监听器,统计 session 创建与销毁 +// sessionManager.registerSessionListener(new SessionListener() { +// @Override +// public void sessionCreated(Session session, HttpServerExchange exchange) { +// sessionsCreated.increment(); +// int now = activeSessions.incrementAndGet(); +// maxActiveSessions.getAndUpdate(max -> Math.max(max, now)); +// } +// +// @Override +// public void sessionDestroyed(Session session, HttpServerExchange exchange, SessionDestroyedReason reason) { +// sessionsExpired.increment(); +// activeSessions.decrementAndGet(); +// } +// }); +// } +// +// /** +// * 包装 Undertow 的 HttpHandler,实现 session 自动创建逻辑 +// * @param next +// * @return +// * @author chenrui +// * @date 2025/4/8 19:07 +// */ +// public HttpHandler wrap(HttpHandler next) { +// return exchange -> { +// // 获取当前 session,如果不存在则创建 +// Session session = sessionManager.getSession(exchange, sessionConfig); +// if (session == null) { +// sessionManager.createSession(exchange, sessionConfig); +// } +// +// // 执行下一个 Handler +// next.handleRequest(exchange); +// }; +// } +//} \ No newline at end of file