SpringBoot內(nèi)嵌Tomcat臨時(shí)目錄問(wèn)題及解決
SpringBoot內(nèi)嵌Tomcat臨時(shí)目錄問(wèn)題
聽(tīng)說(shuō)后面上線可能tomcat臨時(shí)文件夾會(huì)被Linux刪除,會(huì)報(bào)找不到錯(cuò)誤,現(xiàn)在趕緊記錄一下,已被不時(shí)之需。
存在文件上傳的SpringBoot項(xiàng)目,在Linux系統(tǒng)部署之后,會(huì)在系統(tǒng)的tmp目錄下生成一個(gè)帶tomcat 及 隨機(jī)字符串的臨時(shí)目錄。
該目錄有可能被linux系統(tǒng)在一定時(shí)間后自動(dòng)清除掉,導(dǎo)致再次上傳文件的時(shí)候,系統(tǒng)就會(huì)報(bào)錯(cuò)。
意思是tomcat的臨時(shí)目錄會(huì)被tmpwatch
刪除掉,甚至可能刪除掉class
文件,導(dǎo)致錯(cuò)誤的發(fā)生
1.背景
線上保障,上線運(yùn)行了幾天的SpringBoot應(yīng)用,突然遇到問(wèn)題:
/tmp/tomcatXXX/work/Tomcat/localhost/XXX is not valid。
應(yīng)用不會(huì)存在/tmp/tomcatXXX/work/Tomcat/localhost/ROOT目錄。經(jīng)查詢,是tomcat在文件上傳時(shí),會(huì)先對(duì)文件進(jìn)行復(fù)制到臨時(shí)目錄,就是該目錄。
之前的應(yīng)用運(yùn)行是正常的,現(xiàn)在出現(xiàn)這個(gè)情況,顯然是創(chuàng)建好的目錄被刪除了。對(duì),就是這個(gè)特殊的/tmp目錄Linux存在清除策略。
清除策略的配置文件路徑如下:
/usr/lib/tmpfiles.d/tmp.conf
打開(kāi)
# This file is part of systemd. # # systemd is free software; you can redistribute it and/or modify it # under the terms of the GNU Lesser General Public License as published by # the Free Software Foundation; either version 2.1 of the License, or # (at your option) any later version. # See tmpfiles.d(5) for details # Clear tmp directories separately, to make them easier to override v /tmp 1777 root root 10d v /var/tmp 1777 root root 30d # Exclude namespace mountpoints created with PrivateTmp=yes x /tmp/systemd-private-%b-* X /tmp/systemd-private-%b-*/tmp x /var/tmp/systemd-private-%b-* X /var/tmp/systemd-private-%b-*/tmp
發(fā)現(xiàn)會(huì)清除10天內(nèi)沒(méi)被訪問(wèn)過(guò)的文件。但是到了這里,有個(gè)疑問(wèn)就是,昨天可以的也就是該目錄是被訪問(wèn)過(guò),今天怎么會(huì)被清除咧?
這個(gè)本人確實(shí)當(dāng)時(shí)很疑惑,然后對(duì)應(yīng)用的假設(shè)為:
/tmp/tomcat.4344543554352.8080/work/Tomcat/localhost/test,發(fā)現(xiàn)該目錄下為空。也就是臨時(shí)文件會(huì)被tomcat清理掉,但是test目錄的創(chuàng)建時(shí)間確實(shí)是在10天前。
到了這里就明白了,雖然test目錄下文件每天都會(huì)有更新,但是**不會(huì)影響test目錄的訪問(wèn)時(shí)間**,并且該文件被刪掉了。/tmp目錄的清理機(jī)制發(fā)現(xiàn)test空目錄是10天前,就直接清理了(**test為空目錄**)。應(yīng)用再去訪問(wèn)就報(bào)錯(cuò)了。
2.方案
原因搞清楚了,解決方案自然很明了,大致有3種:
- 1.從Linux層面修改 /tmp目錄的清理策略,比較簡(jiǎn)單,略過(guò)
- 2.指定新的系統(tǒng)臨時(shí)文件路徑
-Djava.io.tmpdir=/var/tmp
- 3. 配置中修改tomcat的臨時(shí)目錄
server: tomcat: basedir: /var/tmp/
3.代碼中配置tomcat臨時(shí)目錄
@Configuration public class MultipartConfig { @Bean MultipartConfigElement multipartConfigElement() { MultipartConfigFactory factory = new MultipartConfigFactory(); String location = System.getProperty("user.dir") + "/data/tmp"; File tmpFile = new File(location); if (!tmpFile.exists()) { tmpFile.mkdirs(); } factory.setLocation(location); return factory.createMultipartConfig(); } }
4.tomcat在臨時(shí)目錄不存在先創(chuàng)建
這個(gè)方案稍微麻煩些,就多啰嗦下。
其實(shí)該方式在spring-boot2.1.4版本進(jìn)行了修訂:在臨時(shí)目錄不存在就創(chuàng)建臨時(shí)目錄。
在該類spring-boot/src/main/java/org/springframework/boot/context/embedded/tomcat/TomcatEmbeddedServletContainerFactory.java中添加了幾行代碼:
catch (NoSuchMethodError ex) { // Tomcat is < 8.0.30. Continue } //新增代碼開(kāi)始 try { context.setCreateUploadTargets(true); } catch (NoSuchMethodError ex) { // Tomcat is < 8.5.39. Continue. } //新增代碼結(jié)束 SkipPatternJarScanner.apply(context, this.tldSkipPatterns);
總結(jié)
以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。
- springboot內(nèi)嵌Tomcat安全漏洞修復(fù)方式
- SpringBoot?升級(jí)內(nèi)嵌Tomcat的操作示例
- SpringBoot如何使用內(nèi)嵌Tomcat問(wèn)題
- SpringBoot內(nèi)嵌tomcat處理有特殊字符轉(zhuǎn)義的問(wèn)題
- Springboot內(nèi)嵌tomcat應(yīng)用原理深入分析
- 解決SpringBoot內(nèi)嵌Tomcat并發(fā)容量的問(wèn)題
- 淺談SpringBoot內(nèi)嵌Tomcat的實(shí)現(xiàn)原理解析
- SpringBoot去除內(nèi)嵌tomcat的實(shí)現(xiàn)
相關(guān)文章
myeclipse創(chuàng)建servlet_動(dòng)力節(jié)點(diǎn)Java學(xué)院整理
這篇文章主要為大家詳細(xì)介紹了myeclipse創(chuàng)建servlet的相關(guān)資料,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2017-07-07Mybatis?Plus?中的LambdaQueryWrapper示例詳解
這篇文章主要介紹了Mybatis?Plus?中的LambdaQueryWrapper,本文通過(guò)示例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2022-03-03Spring6當(dāng)中獲取Bean的四種方式小結(jié)
Spring 為Bean 的獲取提供了多種方式,通常包括4種方式,(也就是說(shuō)在Spring中為Bean對(duì)象的創(chuàng)建準(zhǔn)備了多種方案,目的是:更加靈活),本文將通過(guò)代碼示例詳細(xì)的給大家介紹了一下這四種方式,需要的朋友可以參考下2024-04-04springboot植入pagerHelper的超詳細(xì)教程
這篇文章主要介紹了springboot植入pagerHelper的超詳細(xì)教程,本文通過(guò)圖文并茂的形式給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2021-01-01Spring?IOC容器基于XML外部屬性文件的Bean管理
這篇文章主要為大家介紹了Spring?IOC容器Bean管理XML外部屬性文件,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2022-05-05IDEA2020.2創(chuàng)建springboot項(xiàng)目卡死在reading maven project的問(wèn)題
這篇文章主要介紹了關(guān)于2020.2IDEA用spring Initializr創(chuàng)建maven的springboot項(xiàng)目卡死在reading maven project的問(wèn)題描述及解決方法,感興趣的朋友跟隨小編一起看看吧2020-09-09springboot啟動(dòng)后和停止前執(zhí)行方法示例詳解
這篇文章主要介紹了springboot啟動(dòng)后和停止前執(zhí)行方法,本文通過(guò)示例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2022-08-08將SpringBoot的Jar注冊(cè)成Windows服務(wù)的實(shí)現(xiàn)方法
當(dāng)前項(xiàng)目有個(gè)地圖編輯器,后端用的是SpringBoot框架,外網(wǎng)剛好有一臺(tái)空閑的Windows服務(wù)器就直接拿來(lái)用了,將Java程序部署成Windows服務(wù)可以用WinSW (Windows Service Wrapper)來(lái)實(shí)現(xiàn),文中有詳細(xì)的操作步驟,需要的朋友可以參考下2023-11-11