WildFly/JBoss部署SOAP API时MIME*.tmp临时文件无法删除求助
WildFly 17.0.1 SOAP请求MIME临时文件累积问题解决方案
问题根源
WildFly内置的Undertow服务器处理请求时,默认会将超过内存阈值的请求内容写入%temp%目录的临时文件(命名为MIME*.tmp)。正常情况下请求处理完成后这些文件会自动删除,但由于SOAP消息处理过程中存在资源泄漏(比如输入流未关闭、线程资源未释放),导致文件被OpenJDK进程锁定,无法自动清理,最终累积占满磁盘。小请求(<0.5MB)未触发磁盘写入,所以不会生成这类文件。
具体解决步骤
1. 调整Undertow请求内存阈值
修改WildFly的standalone.xml或domain.xml配置文件,调高内存处理请求的阈值,让2.5MB的请求直接在内存中处理,避免写入临时文件:
<subsystem xmlns="urn:jboss:domain:undertow:7.0"> <buffer-cache name="default"/> <server name="default-server"> <http-listener name="default" socket-binding="http" redirect-socket="https"/> <host name="default-host" alias="localhost"> <location name="/" handler="welcome-content"/> <filter-ref name="server-header"/> <filter-ref name="x-powered-by-header"/> </host> </server> <servlet-container name="default"> <jsp-config/> <websockets/> <!-- 设置最大POST请求大小为5MB(大于2.5MB即可) --> <max-post-size value="5242880"/> <request-parsing> <!-- 设置内存缓冲请求的最大大小,超过才写入临时文件 --> <max-buffered-request-size value="5242880"/> <max-parameters value="1000"/> <max-header-size value="1048576"/> </request-parsing> </servlet-container> <handlers> <file name="welcome-content" path="${jboss.home.dir}/welcome-content"/> </handlers> <filters> <response-header name="server-header" header-name="Server" header-value="WildFly/17"/> <response-header name="x-powered-by-header" header-name="X-Powered-By" header-value="Undertow/1"/> </filters> </subsystem>
修改后重启WildFly即可生效。
2. 修复SOAP代码中的资源泄漏
检查你的SOAP API处理代码,确保所有输入流、输出流在请求处理完成后正确关闭,推荐使用try-with-resources语法自动管理资源:
// 正确示例:自动关闭输入流 try (InputStream reqStream = request.getInputStream()) { SOAPMessage soapMsg = MessageFactory.newInstance().createMessage(null, reqStream); // 执行SOAP消息处理逻辑 } catch (Exception e) { // 异常处理逻辑 }
同时排查是否存在线程池泄漏、JAX-WS引擎资源未正确释放的情况,确保每个请求的资源都在请求周期结束后被回收。
3. 配置临时文件定时清理(兜底方案)
如果无法完全避免临时文件生成,可配置定时任务清理未被锁定的临时文件:
- 在
standalone.xml中添加调度器配置:
<subsystem xmlns="urn:jboss:domain:scheduler:1.0"> <scheduler name="temp-file-cleaner" thread-pool-name="default"> <trigger type="cron" expression="0 0 * * * ?"/> <!-- 每小时执行一次 --> <job class="com.yourcompany.TempFileCleaner"/> </scheduler> </subsystem>
- 编写清理类
TempFileCleaner,只删除未被进程锁定的文件:
public class TempFileCleaner implements Runnable { @Override public void run() { File tempDir = new File(System.getProperty("java.io.tmpdir")); File[] mimeFiles = tempDir.listFiles((dir, name) -> name.startsWith("MIME")); if (mimeFiles != null) { for (File file : mimeFiles) { try { // 能删除则说明文件未被锁定 if (file.delete()) { System.out.printf("Deleted temp file: %s%n", file.getName()); } } catch (Exception ignored) { // 文件被锁定,跳过 } } } } }
将该类打包为模块或放入WildFly部署目录,确保能被类加载器加载。
4. 应急清理方案
如果磁盘已被占满,先重启WildFly进程(进程关闭后文件锁定会自动释放),然后手动删除%temp%目录下所有MIME*.tmp文件,快速缓解磁盘压力。
验证方法
- 发送2.5MB的SOAP请求,检查
%temp%目录是否不再生成MIME*.tmp文件; - 持续运行系统,监控临时文件数量和磁盘占用,确认问题解决。
内容的提问来源于stack exchange,提问作者Qwerty
相关产品推荐
相关产品推荐

