聽說后面上線可能tomcat臨時文件夾會被Linux刪除,會報找不到錯誤,現(xiàn)在趕緊記錄一下,已被不時之需.
在東坡等地區(qū),都構建了全面的區(qū)域性戰(zhàn)略布局,加強發(fā)展的系統(tǒng)性、市場前瞻性、產(chǎn)品創(chuàng)新能力,以專注、極致的服務理念,為客戶提供網(wǎng)站制作、成都做網(wǎng)站 網(wǎng)站設計制作按需求定制開發(fā),公司網(wǎng)站建設,企業(yè)網(wǎng)站建設,高端網(wǎng)站設計,成都全網(wǎng)營銷,成都外貿(mào)網(wǎng)站建設公司,東坡網(wǎng)站建設費用合理。存在文件上傳的SpringBoot項目,在Linux系統(tǒng)部署之后,會在系統(tǒng)的tmp目錄下生成一個帶tomcat 及 隨機字符串的臨時目錄。
該目錄有可能被linux系統(tǒng)在一定時間后自動清除掉,導致再次上傳文件的時候,系統(tǒng)就會報錯。
意思是tomcat的臨時目錄會被tmpwatch
刪除掉,甚至可能刪除掉class
文件,導致錯誤的發(fā)生
線上保障,上線運行了幾天的SpringBoot應用,突然遇到問題:/tmp/tomcatXXX/work/Tomcat/localhost/XXX is not valid。
應用不會存在/tmp/tomcatXXX/work/Tomcat/localhost/ROOT目錄。經(jīng)查詢,是tomcat在文件上傳時,會先對文件進行復制到臨時目錄,就是該目錄。之前的應用運行是正常的,現(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)沒被訪問過的文件。但是到了這里,有個疑問就是,昨天可以的也就是該目錄是被訪問過,今天怎么會被清除咧?
這個本人確實當時很疑惑,然后對應用的假設為:/tmp/tomcat.4344543554352.8080/work/Tomcat/localhost/test,發(fā)現(xiàn)該目錄下為空。也就是臨時文件會被tomcat清理掉,但是test目錄的創(chuàng)建時間確實是在10天前。
3. 方案到了這里就明白了,雖然test目錄下文件每天都會有更新,但是**不會影響test目錄的訪問時間**,并且該文件被刪掉了。/tmp目錄的清理機制發(fā)現(xiàn)test空目錄是10天前,就直接清理了(**test為空目錄**)。應用再去訪問就報錯了。
原因搞清楚了,解決方案自然很明了,大致有3種:
1.從Linux層面修改 /tmp目錄的清理策略,比較簡單,略過
2.指定新的系統(tǒng)臨時文件路徑
-Djava.io.tmpdir=/var/tmp
3. 配置中修改tomcat的臨時目錄
server: tomcat: basedir: /var/tmp/
4.代碼中配置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();
? }
}
5.tomcat在臨時目錄不存在先創(chuàng)建
這個方案稍微麻煩些,就多啰嗦下。其實該方式在spring-boot2.1.4版本進行了修訂:在臨時目錄不存在就創(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.
}
//新增代碼結束
SkipPatternJarScanner.apply(context, this.tldSkipPatterns);
你是否還在尋找穩(wěn)定的海外服務器提供商?創(chuàng)新互聯(lián)www.cdcxhl.cn海外機房具備T級流量清洗系統(tǒng)配攻擊溯源,準確流量調(diào)度確保服務器高可用性,企業(yè)級服務器適合批量采購,新人活動首月15元起,快前往官網(wǎng)查看詳情吧