SpringBoot中的tomcat如何修改和优化
创始人
2024-11-16 04:22:43
0次

项目背景

在做项目的时候,把SpringBoot的项目打包成安装包了,在客户上面安装运行,一切都是那么的完美,可是发生了意外,对方突然说导出导入的文件都不行了。我急急忙忙的查看日志,发现报了一个错误

java.io.IOException: The temporary upload location [C:\Windows\Temp\tomcat.1351070438015228346.8884\work\Tomcat\localhost\ROOT] is not valid
 at org.apache.catalina.connector.Request.parseParts(Request.java:2821)
 at org.apache.catalina.connector.Request.parseParameters(Request.java:3185)
 at org.apache.catalina.connector.Request.getParameter(Request.java:1116)
 at org.apache.catalina.connector.RequestFacade.getParameter(RequestFacade.java:381)
 at org.springframework.web.filter.HiddenHttpMethodFilter.doFilterInternal(HiddenHttpMethodFilter.java:84)
 at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:107)
 at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193)
 at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166)
 at org.springframework.web.filter.CharacterEncodingFilter.doFilterInternal(CharacterEncodingFilter.java:200)
 at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:107)
 at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193)
 at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166)
 at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:199)
 at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:96)
 at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:490)
 at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:139)
 at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:92)
 at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:74)
 at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:343)
 at org.apache.coyote.http11.Http11Processor.service(Http11Processor.java:408)
 at org.apache.coyote.AbstractProcessorLight.process(AbstractProcessorLight.java:66)
 at org.apache.coyote.AbstractProtocol$ConnectionHandler.process(AbstractProtocol.java:791)
 at org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.doRun(NioEndpoint.java:1417)
 at org.apache.tomcat.util.net.SocketProcessorBase.run(SocketProcessorBase.java:49)
 at java.util.concurrent.ThreadPoolExecutor.runWorker(Unknown Source)
 at java.util.concurrent.ThreadPoolExecutor$Worker.run(Unknown Source)
 at org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61)
 at java.lang.Thread.run(Unknown Source)

经过分析发现,这是tomcat在启动的时候会生成一个临时的上传文件保存的位置,但是这个位子默认是放在系统的临时文件夹中。当这个tomcat创建的文件夹被系统删除后,这时在上传文件就出现问题了。可能对方服务器装上了360管家,会自动删掉好似

开工

针对这一个异常有以下解决方法
1.万能的重启,绝大多数的问题解决方法,“你重启一下试试”。但是这个方法只能解决得了一时,解决不了一世啊。
2.在配置文件中加上

server.tomcat.basedir=自定义目录

3.启动jar包的时候加上参数 -Djava.io.tmpdir=自定义目录

java -jar xx.jar -Djava.io.tmpdir=自定义目录 

4.添加配置bean

import org.springframework.boot.web.servlet.MultipartConfigFactory;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;


import javax.servlet.MultipartConfigElement;

@Configuration
public class TomcatBeanConfig {

  /**
   * 文件上传临时路径
   */
  @Bean
  MultipartConfigElement multipartConfigElement() {
    MultipartConfigFactory factory = new MultipartConfigFactory();
    factory.setLocation("自定义目录");
    return factory.createMultipartConfig();
  }
}

-------------------------------------分隔符 ------------------------------------------

接着说优化,至于优化,我在解决上面的问题发现,tomcat中有一个配置

# 后台线程方法的delay大小每隔900s清除过期的session会话
server.tomcat.background-processor-delay=900

默认值是10, 每隔10s发生一次young gc,并且CPU使用率长期大于10%。

ContainerBackgroundProcessor这个线程是干什么的?

Tomcat的Engine会启动一个线程(就是ContainerBackgroundProcessor),该线程每10s会发送一个发送一个事件,监听到该事件的部署配置类会自动去扫描webapp文件夹下的war包,将其加载成一个Context,即启动一个web服务。同时,该线程还会调用子容器Engine、Host、Context、Wrapper各容器组件及与它们相关的其它组件的backgroundProcess方法。

个人理解是,每隔10S对session的过期清理过于频繁从而导致CPU占用率过高,
我改成了900,就是每900秒检测一次,这样就降低CPU占用率啦

backgroundProcess对spring mvc的影响
主要影响session的过期清理,如果设置为900,
就只会每隔900s清除过期的session会话。

server.tomcat.background-processor-delay = 900s 
#调用backgroundProcess方法之间的延迟。如果未指定持续时间后缀,则将使用秒。

相关内容

热门资讯

空调连续工作多久需要停机休息 空调连续工作的时间取决于多个因素,包括空调的型号、功率、使用环境和维护情况等。一般来说,空调可以连续...
空调哪个符号是除湿的 空调除湿功能通常用一个水滴形状的符号表示。不同品牌和型号的空调遥控器可能会有所差异,但一般来说,除湿...
格力空调多长时间加一次氟利昂 1、一般情况下,空调对氟利昂的使用量是非常小的,所以在空调使用了四年左右的时候再考虑加也没问题。2、...
空调用多长时间需要加氟一次 一般情况下是五年。当出现以下这几种情况时,空调才需要加氟。1、空调的室内机和室外机各有两个接口,当接...
格调生活·C标思享荟:卡萨帝在... 9月12日的郑州龙湖金融岛,夜风轻拂,灯光璀璨。“C标时刻共传奇——卡萨帝思享荟暨20周年品牌盛典郑...
品牌价值破千亿、高端份额持续领... 9月12日,“C标时刻共传奇——卡萨帝思享荟暨20周年品牌盛典郑州站”在郑州龙湖金融岛举办。2026...
空调主板坏了修800还是换新的 空调主板坏了是修还是换新,需要考虑多个因素,以下是一些建议:1. 维修成本:如果维修费用较低,比如 ...
空调开多久需要休息多长时间 问题:空调开多久需要休息多长时间回答:1、在使用空调的过程中,一般空调开7~8个小时左右需要休息2~...
中央空调多长时间清洗一次 1、一般空调开机前清洗一次即可,空调开机中间时段再清洗一次,空调关机时清洗一次,这样比较合理。2、空...
中央空调氟利昂多久加一次 看空调制热和制冷程度,很多人的观点认为氟利昂必须一年放一次,其实这个观点是错误的,理解上面有点偏差,...