欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

SpringBoot內(nèi)嵌Tomcat臨時(shí)目錄問(wèn)題及解決

 更新時(shí)間:2025年04月21日 15:33:10   作者:火冠蜂鳥(niǎo)  
這篇文章主要介紹了SpringBoot內(nèi)嵌Tomcat臨時(shí)目錄問(wèn)題及解決,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教

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è)參考,也希望大家多多支持腳本之家。

相關(guān)文章

  • myeclipse創(chuàng)建servlet_動(dòng)力節(jié)點(diǎn)Java學(xué)院整理

    myeclipse創(chuàng)建servlet_動(dòng)力節(jié)點(diǎn)Java學(xué)院整理

    這篇文章主要為大家詳細(xì)介紹了myeclipse創(chuàng)建servlet的相關(guān)資料,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2017-07-07
  • Mybatis?Plus?中的LambdaQueryWrapper示例詳解

    Mybatis?Plus?中的LambdaQueryWrapper示例詳解

    這篇文章主要介紹了Mybatis?Plus?中的LambdaQueryWrapper,本文通過(guò)示例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2022-03-03
  • Spring6當(dāng)中獲取Bean的四種方式小結(jié)

    Spring6當(dāng)中獲取Bean的四種方式小結(jié)

    Spring 為Bean 的獲取提供了多種方式,通常包括4種方式,(也就是說(shuō)在Spring中為Bean對(duì)象的創(chuàng)建準(zhǔn)備了多種方案,目的是:更加靈活),本文將通過(guò)代碼示例詳細(xì)的給大家介紹了一下這四種方式,需要的朋友可以參考下
    2024-04-04
  • Java并發(fā)編程之線程安全性

    Java并發(fā)編程之線程安全性

    這篇文章主要介紹了Java并發(fā)編程之線程安全性,文章基于Java的相關(guān)內(nèi)容詳細(xì)的展開(kāi)詳細(xì)介紹,需要的小伙伴可以參考一下
    2022-04-04
  • struts2框架入門

    struts2框架入門

    本文主要介紹了struts2框架的基礎(chǔ)入門知識(shí)。具有很好的參考價(jià)值。下面跟著小編一起來(lái)看下吧
    2017-03-03
  • springboot植入pagerHelper的超詳細(xì)教程

    springboot植入pagerHelper的超詳細(xì)教程

    這篇文章主要介紹了springboot植入pagerHelper的超詳細(xì)教程,本文通過(guò)圖文并茂的形式給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2021-01-01
  • Spring?IOC容器基于XML外部屬性文件的Bean管理

    Spring?IOC容器基于XML外部屬性文件的Bean管理

    這篇文章主要為大家介紹了Spring?IOC容器Bean管理XML外部屬性文件,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2022-05-05
  • IDEA2020.2創(chuàng)建springboot項(xiàng)目卡死在reading maven project的問(wèn)題

    IDEA2020.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-09
  • springboot啟動(dòng)后和停止前執(zhí)行方法示例詳解

    springboot啟動(dòng)后和停止前執(zhí)行方法示例詳解

    這篇文章主要介紹了springboot啟動(dòng)后和停止前執(zhí)行方法,本文通過(guò)示例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2022-08-08
  • 將SpringBoot的Jar注冊(cè)成Windows服務(wù)的實(shí)現(xiàn)方法

    將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

最新評(píng)論