TongWeb8防止System.exit代码导致的进程停止

文章讨论了当Java应用程序使用System.exit或Runtime.exit时,可能会引起TongWeb进程意外停止,产生内存泄漏风险。解决方案包括删除相关代码或启用TongWeb的安全策略以阻止系统退出请求。在启用安全策略后,系统会拦截并记录尝试退出的日志。

现象:

当应用中存在System.exit 、Runtime.exit代码执行时,会导致TongWeb进程停止,从而产生如下日志:

2023-02-14 09:47:36 [WARN] - The web application [webtest01] is still processing a request that has yet to finish. This is very likely to create a memory leak. You can control the time allowed for requests to finish by using the unloadDelay attribute of the standard Context implementation. Stack trace of request processing thread:[
java.lang.Object.wait(Native Method)
java.lang.Thread.join(Thread.java:1257)
java.lang.Thread.join(Thread.java:1331)
java.lang.ApplicationShutdownHooks.runHooks(ApplicationShutdownHooks.java:107)
java.lang.ApplicationShutdownHooks$1.run(ApplicationShutdownHooks.java:46)
java.lang.Shutdown.runHooks(Shutdown.java:123)
java.lang.Shutdown.sequence(Shutdown.java:170)
java.lang.Shutdown.exit(Shutdown.java:216)
java.lang.Runtime.exit(Runtime.java:109)
java.lang.System.exit(System.java:971)
com.tong.TestServlet.doGet(TestServlet.java:41)
javax.servlet.http.HttpServlet.service(HttpServlet.java:503)
javax.servlet.http.HttpServlet.service(HttpServlet.java:590)
com.tongweb.server.core.ApplicationFilterChain.enterApp(ApplicationFilterChain.java:365)

解决方式:

方式一:修改应用代码,将System.exit 、Runtime.exit代码删除。

方式二:开启TongWeb的安全策略功能,禁止System.exit退出。

开启后拦截日志有如下输出:

System exit request has been denied.
java.lang.Thread.getStackTrace(Thread.java:1564)
java.lang.Shutdown.exit(Shutdown.java)
java.lang.Runtime.exit(Runtime.java:109)
java.lang.System.exit(System.java:971)
com.tong.TestServlet.doGet(TestServlet.java:41)
javax.servlet.http.HttpServlet.service(HttpServlet.java:503)
javax.servlet.http.HttpServlet.service(HttpServlet.java:590)

### TongWeb启动时出现 `java.lang.ClassNotFoundException: com.tongweb.catalina.startup.ThanosCatalina` 的原因分析与解决方案 #### 1. 原因分析 `java.lang.ClassNotFoundException` 表示 Java 虚拟机无法找到指定的类。在本例中,TongWeb 启动时抛出 `ClassNotFoundException: com.tongweb.catalina.startup.ThanosCatalina`,表明系统缺少该类文件或其依赖项未正确加载。可能的原因包括以下几种[^1]: - **类路径配置错误**:TongWeb 的运行环境中未包含 `com.tongweb.catalina.startup.ThanosCatalina` 所在的 JAR 文件。 - **JAR 文件缺失或损坏**:相关 JAR 文件可能未被正确部署到 TongWeb 的 `lib` 目录下,或者文件本身已损坏。 - **版本不匹配**:TongWeb 的版本与所使用的依赖库版本不兼容。 - **自定义类加载器问题**:如果项目中存在自定义类加载器,可能导致某些类未能正确加载。 #### 2. 解决方案 以下是针对上述问题的具体解决方法: ##### 2.1 检查类路径配置 确保 `com.tongweb.catalina.startup.ThanosCatalina` 所需的 JAR 文件已正确放置在 TongWeb 的 `lib` 目录下。可以通过以下步骤验证: - 进入 TongWeb 的安装目录,定位到 `lib` 文件夹。 - 使用解压工具打开每个 JAR 文件,检查是否存在 `com/tongweb/catalina/startup/ThanosCatalina.class` 文件。 - 如果文件缺失,请从官方文档或下载渠道获取正确的 JAR 包,并将其添加到 `lib` 目录中[^1]。 ##### 2.2 校验 JAR 文件完整性 如果怀疑 JAR 文件损坏,可以尝试重新下载并替换。此外,还可以通过以下命令校验文件的 MD5 或 SHA 校验值: ```bash md5sum your-jar-file.jar ``` 将输出的校验值与官方提供的值进行比对,确认文件完整性。 ##### 2.3 确认版本兼容性 确保 TongWeb 的版本与所使用的依赖库版本一致。例如,如果使用的是 TongWeb 8.x 版本,则需要确认其依赖的 Tomcat 或其他组件是否为兼容版本。可通过官方文档或发行说明查询版本兼容性信息[^1]。 ##### 2.4 检查自定义类加载器 如果项目中使用了自定义类加载器,可能会干扰 TongWeb 的默认加载机制。建议临时移除自定义类加载器,观察问题是否仍然存在。若问题消失,则需调整自定义类加载器的逻辑以避免冲突。 ##### 2.5 查阅日志文件 详细分析 TongWeb 的启动日志,定位具体的异常堆栈信息。日志文件通常位于 TongWeb 安装目录下的 `logs` 文件夹中。重点关注以下内容: - 异常发生的时间点。 - 异常上下文中涉及的其他类或方法。 - 可能的触发条件或环境因素。 #### 3. 示例代码 以下是一个简单的脚本,用于检查 JAR 文件中是否存在特定类: ```python import zipfile def check_class_in_jar(jar_path, class_name): with zipfile.ZipFile(jar_path, 'r') as jar: for entry in jar.namelist(): if entry.endswith('.class') and class_name.replace('.', '/') + '.class' in entry: return True return False jar_file = "path/to/your-jar-file.jar" class_to_check = "com.tongweb.catalina.startup.ThanosCatalina" if check_class_in_jar(jar_file, class_to_check): print(f"Class {class_to_check} exists in {jar_file}.") else: print(f"Class {class_to_check} not found in {jar_file}.") ``` #### 4. 注意事项 - 在修改 TongWeb 配置或部署文件前,请备份原始文件,以便出现问题时快速恢复。 - 如果问题仍未解决,可联系 TongWeb 官方技术支持团队,提供详细的日志信息和环境描述。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值