SpringBoot內(nèi)嵌Tomcat臨時目錄問題及解決
SpringBoot內(nèi)嵌Tomcat臨時目錄問題
聽說后面上線可能tomcat臨時文件夾會被Linux刪除,會報找不到錯誤,現(xiàn)在趕緊記錄一下,已被不時之需。
存在文件上傳的SpringBoot項目,在Linux系統(tǒng)部署之后,會在系統(tǒng)的tmp目錄下生成一個帶tomcat 及 隨機(jī)字符串的臨時目錄。
該目錄有可能被linux系統(tǒng)在一定時間后自動清除掉,導(dǎo)致再次上傳文件的時候,系統(tǒng)就會報錯。
意思是tomcat的臨時目錄會被tmpwatch
刪除掉,甚至可能刪除掉class
文件,導(dǎo)致錯誤的發(fā)生
1.背景
線上保障,上線運(yùn)行了幾天的SpringBoot應(yīng)用,突然遇到問題:
/tmp/tomcatXXX/work/Tomcat/localhost/XXX is not valid。
應(yīng)用不會存在/tmp/tomcatXXX/work/Tomcat/localhost/ROOT目錄。經(jīng)查詢,是tomcat在文件上傳時,會先對文件進(jìn)行復(fù)制到臨時目錄,就是該目錄。
之前的應(yīng)用運(yùn)行是正常的,現(xiàn)在出現(xiàn)這個情況,顯然是創(chuàng)建好的目錄被刪除了。對,就是這個特殊的/tmp目錄Linux存在清除策略。
清除策略的配置文件路徑如下:
/usr/lib/tmpfiles.d/tmp.conf
打開
# 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)會清除10天內(nèi)沒被訪問過的文件。但是到了這里,有個疑問就是,昨天可以的也就是該目錄是被訪問過,今天怎么會被清除咧?
這個本人確實當(dāng)時很疑惑,然后對應(yīng)用的假設(shè)為:
/tmp/tomcat.4344543554352.8080/work/Tomcat/localhost/test,發(fā)現(xiàn)該目錄下為空。也就是臨時文件會被tomcat清理掉,但是test目錄的創(chuàng)建時間確實是在10天前。
到了這里就明白了,雖然test目錄下文件每天都會有更新,但是**不會影響test目錄的訪問時間**,并且該文件被刪掉了。/tmp目錄的清理機(jī)制發(fā)現(xiàn)test空目錄是10天前,就直接清理了(**test為空目錄**)。應(yīng)用再去訪問就報錯了。
2.方案
原因搞清楚了,解決方案自然很明了,大致有3種:
- 1.從Linux層面修改 /tmp目錄的清理策略,比較簡單,略過
- 2.指定新的系統(tǒng)臨時文件路徑
-Djava.io.tmpdir=/var/tmp
- 3. 配置中修改tomcat的臨時目錄
server: tomcat: basedir: /var/tmp/
3.代碼中配置tomcat臨時目錄
@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在臨時目錄不存在先創(chuàng)建
這個方案稍微麻煩些,就多啰嗦下。
其實該方式在spring-boot2.1.4版本進(jìn)行了修訂:在臨時目錄不存在就創(chuàng)建臨時目錄。
在該類spring-boot/src/main/java/org/springframework/boot/context/embedded/tomcat/TomcatEmbeddedServletContainerFactory.java中添加了幾行代碼:
catch (NoSuchMethodError ex) { // Tomcat is < 8.0.30. Continue } //新增代碼開始 try { context.setCreateUploadTargets(true); } catch (NoSuchMethodError ex) { // Tomcat is < 8.5.39. Continue. } //新增代碼結(jié)束 SkipPatternJarScanner.apply(context, this.tldSkipPatterns);
總結(jié)
以上為個人經(jīng)驗,希望能給大家一個參考,也希望大家多多支持腳本之家。
相關(guān)文章
myeclipse創(chuàng)建servlet_動力節(jié)點Java學(xué)院整理
這篇文章主要為大家詳細(xì)介紹了myeclipse創(chuàng)建servlet的相關(guān)資料,具有一定的參考價值,感興趣的小伙伴們可以參考一下2017-07-07Mybatis?Plus?中的LambdaQueryWrapper示例詳解
這篇文章主要介紹了Mybatis?Plus?中的LambdaQueryWrapper,本文通過示例代碼給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下2022-03-03Spring6當(dāng)中獲取Bean的四種方式小結(jié)
Spring 為Bean 的獲取提供了多種方式,通常包括4種方式,(也就是說在Spring中為Bean對象的創(chuàng)建準(zhǔn)備了多種方案,目的是:更加靈活),本文將通過代碼示例詳細(xì)的給大家介紹了一下這四種方式,需要的朋友可以參考下2024-04-04springboot植入pagerHelper的超詳細(xì)教程
這篇文章主要介紹了springboot植入pagerHelper的超詳細(xì)教程,本文通過圖文并茂的形式給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下2021-01-01Spring?IOC容器基于XML外部屬性文件的Bean管理
這篇文章主要為大家介紹了Spring?IOC容器Bean管理XML外部屬性文件,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2022-05-05IDEA2020.2創(chuàng)建springboot項目卡死在reading maven project的問題
這篇文章主要介紹了關(guān)于2020.2IDEA用spring Initializr創(chuàng)建maven的springboot項目卡死在reading maven project的問題描述及解決方法,感興趣的朋友跟隨小編一起看看吧2020-09-09springboot啟動后和停止前執(zhí)行方法示例詳解
這篇文章主要介紹了springboot啟動后和停止前執(zhí)行方法,本文通過示例代碼給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下2022-08-08將SpringBoot的Jar注冊成Windows服務(wù)的實現(xiàn)方法
當(dāng)前項目有個地圖編輯器,后端用的是SpringBoot框架,外網(wǎng)剛好有一臺空閑的Windows服務(wù)器就直接拿來用了,將Java程序部署成Windows服務(wù)可以用WinSW (Windows Service Wrapper)來實現(xiàn),文中有詳細(xì)的操作步驟,需要的朋友可以參考下2023-11-11