我正在尝试修复/调试使用嵌入式 tomcat 的 spring-boot web 应用程序中关闭连接过多的问题。问题出现是因为它关闭了应该保持活动的连接。
现在,我发现,Tomcat有配置限制保持活动连接数(见maxKeepAliveRequests在https://tomcat.apache.org/tomcat-8.5-doc/config/http.html),并有可能是其它的配置,可以与问题有关。但我的问题是我没有看到这些参数在哪里给出,或者如果使用默认值我可以如何更改它们。
我的问题:我在哪里可以找到解释如何配置 spring-boot/embedded-tomcat keep-alive 参数的文档,这些参数是哪些?
我尝试使用我的 Spring Boot API 上传文件。当我使用小文件(小于 1 MB)时,该函数工作正常,但当我上传大文件时,它给了我一个例外。我正在使用嵌入式 Tomcat 服务器。
Maximum upload size exceeded;
nested exception is java.lang.IllegalStateException: org.apache.tomcat.util.http.fileupload.impl.FileSizeLimitExceededException: The field file exceeds its maximum permitted size of 1048576 bytes.
Run Code Online (Sandbox Code Playgroud)
我在我的文件中尝试了以下代码,但每次我都会收到错误
1. 应用程序.属性
server.tomcat.max-swallow-size=100MB
server.tomcat.max-http-post-size=100MB
spring.servlet.multipart.enabled=true
spring.servlet.multipart.fileSizeThreshold=100MB
spring.servlet.multipart.max-file-size=100MB
spring.servlet.multipart.max-request-size=100MB
Run Code Online (Sandbox Code Playgroud)
我也尝试过
spring.servlet.multipart.maxFileSize=100MB
spring.servlet.multipart.maxRequestSize=100MB
Run Code Online (Sandbox Code Playgroud)
2.以下是我的文件上传代码
public RestDTO uploadFile(MultipartFile file, String subPath) {
if (file.isEmpty()) {
return new RestFailure("Failed to store empty file");
}
try {
String fileName = new Date().getTime() + "_" + file.getOriginalFilename();
String filePath = uploadPath + subPath + fileName;
if …Run Code Online (Sandbox Code Playgroud) 我正在尝试让一个简单的嵌入式 tomcat10.1.0-M11示例正常工作,但是localhost refused to connect当我访问http://localhost:8080/aa.
这是我的代码:
import jakarta.servlet.ServletException;
import jakarta.servlet.http.HttpServlet;
import jakarta.servlet.http.HttpServletRequest;
import jakarta.servlet.http.HttpServletResponse;
import java.io.File;
import java.io.IOException;
import java.io.PrintWriter;
import org.apache.catalina.Context;
import org.apache.catalina.LifecycleException;
import org.apache.catalina.startup.Tomcat;
public class App {
public static void main(String[] args) throws LifecycleException {
Tomcat tomcat = new Tomcat();
tomcat.setBaseDir("temp");
tomcat.setPort(8080);
String contextPath = "";
String docBase = new File(".").getAbsolutePath();
Context context = tomcat.addContext(contextPath, docBase);
class SampleServlet extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp)
throws ServletException, IOException …Run Code Online (Sandbox Code Playgroud) 如Spring Boot 3 迁移指南中所述,server.max -http-header-size属性已被弃用。您可以使用server.max-http-request-header-size属性仅设置最大 http 请求标头大小。
我收到以下异常:
org.apache.coyote.http11.HeadersTooLargeException: An attempt was made to write
more data to the response headers than there was room available in the buffer.
Increase maxHttpHeaderSize on the connector
or write less data into the response headers.
Run Code Online (Sandbox Code Playgroud)
我需要增加嵌入式 Tomcat 10 中的最大 http 响应标头大小。Tomcat 10支持maxHttpHeaderSize和maxHttpResponseHeaderSize属性。
我如何在 Spring Boot 3.x 中使用 来设置这些WebServerFactoryCustomizer?
我有 2 个相对简单的 Gradle 6.1.1 配置,一个是使用https://plugins.gradle.org/plugin/com.github.node-gradle.node来构建一个 React 应用程序,另一个是基于https: //plugins.gradle.org/plugin/com.bmuschko.tomcat并在嵌入式 tomcat 中运行一个简单的 wicket 应用程序。
npm 任务的第一个配置是:
apply plugin: 'com.github.node-gradle.node'
node {
version = '12.16.0'
download = true
workDir = file "$project.buildDir/nodejs"
}
task "npmBuild"( type:NpmTask ) {
args = [ 'run', 'build' ]
}
Run Code Online (Sandbox Code Playgroud)
并在 Windows 10 中产生以下输出:
>gradlew.bat npmBuild
Starting a Gradle Daemon (subsequent builds will be faster)
> Task :npmBuild
> layer-selection@0.1.0 build .....
> react-scripts build
Creating an optimized production build...
Compiled with warnings. …Run Code Online (Sandbox Code Playgroud) 我的代码抛出异常如下
JSON parse error: java.net.SocketTimeoutException; nested exception is com.fasterxml.jackson.databind.JsonMappingException: java.net.SocketTimeoutException (through reference chain: java.util.ArrayList[9])
org.springframework.http.converter.HttpMessageNotReadableException: JSON parse error: java.net.SocketTimeoutException; nested exception is com.fasterxml.jackson.databind.JsonMappingException: java.net.SocketTimeoutException (through reference chain: java.util.ArrayList[9])
at org.springframework.http.converter.json.AbstractJackson2HttpMessageConverter.readJavaType(AbstractJackson2HttpMessageConverter.java:245) ~[spring-web-5.1.9.RELEASE.jar!/:5.1.9.RELEASE]
at org.springframework.http.converter.json.AbstractJackson2HttpMessageConverter.read(AbstractJackson2HttpMessageConverter.java:227) ~[spring-web-5.1.9.RELEASE.jar!/:5.1.9.RELEASE]
at org.springframework.web.servlet.mvc.method.annotation.AbstractMessageConverterMethodArgumentResolver.readWithMessageConverters(AbstractMessageConverterMethodArgumentResolver.java:204) ~[spring-webmvc-5.1.9.RELEASE.jar!/:5.1.9.RELEASE]
at org.springframework.web.servlet.mvc.method.annotation.RequestResponseBodyMethodProcessor.readWithMessageConverters(RequestResponseBodyMethodProcessor.java:157) ~[spring-webmvc-5.1.9.RELEASE.jar!/:5.1.9.RELEASE]
at org.springframework.web.servlet.mvc.method.annotation.RequestResponseBodyMethodProcessor.resolveArgument(RequestResponseBodyMethodProcessor.java:130) ~[spring-webmvc-5.1.9.RELEASE.jar!/:5.1.9.RELEASE]
at org.springframework.web.method.support.HandlerMethodArgumentResolverComposite.resolveArgument(HandlerMethodArgumentResolverComposite.java:127) ~[spring-web-5.1.9.RELEASE.jar!/:5.1.9.RELEASE]
at org.springframework.web.method.support.InvocableHandlerMethod.getMethodArgumentValues(InvocableHandlerMethod.java:167) ~[spring-web-5.1.9.RELEASE.jar!/:5.1.9.RELEASE]
at org.springframework.web.method.support.InvocableHandlerMethod.invokeForRequest(InvocableHandlerMethod.java:134) ~[spring-web-5.1.9.RELEASE.jar!/:5.1.9.RELEASE]
at org.springframework.web.servlet.mvc.method.annotation.ServletInvocableHandlerMethod.invokeAndHandle(ServletInvocableHandlerMethod.java:104) ~[spring-webmvc-5.1.9.RELEASE.jar!/:5.1.9.RELEASE]
at org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.invokeHandlerMethod(RequestMappingHandlerAdapter.java:892) ~[spring-webmvc-5.1.9.RELEASE.jar!/:5.1.9.RELEASE]
at org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.handleInternal(RequestMappingHandlerAdapter.java:797) ~[spring-webmvc-5.1.9.RELEASE.jar!/:5.1.9.RELEASE]
at org.springframework.web.servlet.mvc.method.AbstractHandlerMethodAdapter.handle(AbstractHandlerMethodAdapter.java:87) ~[spring-webmvc-5.1.9.RELEASE.jar!/:5.1.9.RELEASE]
at org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:1039) [spring-webmvc-5.1.9.RELEASE.jar!/:5.1.9.RELEASE]
Run Code Online (Sandbox Code Playgroud)
我的spring-boot版本是2.1.7.RELEASE,嵌入式tomcat用于运行应用程序。我也设置了属性server.connection-timeout=30s
我几乎到处搜索都无法找出这个问题的根本原因。我还捕获此异常并将其打印在日志中并将响应作为 BAD_REQUEST 返回。
这个异常是间歇性抛出的,我的生产服务器此时消耗了 80% 以上的 CPU 和内存。
这实际上是一个 POST 请求,请求正文的验证如下 …
环境
操作系统:macOS Mojave 版本 10.14.5(centOS 也有同样的问题)
Springboot:2.1.6.RELEASE(内嵌tomcat 9.0.21),war
我是Spring Boot的新手,我认为这对我的项目有帮助。现在我已经完成了我的工作,但是一个奇怪的现象困扰着我。我的项目响应第一个请求大约需要 5 分钟,它花费 5 分钟而不是 5 秒,第一次之后的请求似乎正常。它非常慢,所以我需要你的帮助。
在jstack我的帮助下,大部分时间都花在了做下面的事情上,同样是做拆包战争。
"http-nio-15281-exec-5" #105 daemon prio=5 os_prio=31 tid=0x00007f988eaff800 nid=0x13b03 runnable [0x0000700013218000]
java.lang.Thread.State: RUNNABLE
at java.util.zip.Inflater.inflateBytes(Native Method)
at java.util.zip.Inflater.inflate(Inflater.java:259)
- locked <0x00000007bac79ab0> (a java.util.zip.ZStreamRef)
at java.util.zip.InflaterInputStream.read(InflaterInputStream.java:152)
at java.util.zip.ZipInputStream.read(ZipInputStream.java:194)
at java.util.jar.JarInputStream.read(JarInputStream.java:207)
at java.util.zip.ZipInputStream.closeEntry(ZipInputStream.java:140)
at java.util.zip.ZipInputStream.getNextEntry(ZipInputStream.java:118)
at java.util.jar.JarInputStream.getNextEntry(JarInputStream.java:142)
at java.util.jar.JarInputStream.getNextJarEntry(JarInputStream.java:179)
at org.apache.catalina.webresources.JarWarResourceSet.getArchiveEntries(JarWarResourceSet.java:117)
- locked <0x00000007810e7770> (a java.lang.Object)
at org.apache.catalina.webresources.AbstractArchiveResourceSet.getResource(AbstractArchiveResourceSet.java:253)
at org.apache.catalina.webresources.StandardRoot.getResourceInternal(StandardRoot.java:282)
at org.apache.catalina.webresources.Cache.getResource(Cache.java:62)
at org.apache.catalina.webresources.StandardRoot.getResource(StandardRoot.java:217)
at org.apache.catalina.webresources.StandardRoot.getClassLoaderResource(StandardRoot.java:226)
at org.apache.catalina.loader.WebappClassLoaderBase.findClassInternal(WebappClassLoaderBase.java:2303)
at org.apache.catalina.loader.WebappClassLoaderBase.findClass(WebappClassLoaderBase.java:865)
at org.springframework.boot.web.embedded.tomcat.TomcatEmbeddedWebappClassLoader.findClassIgnoringNotFound(TomcatEmbeddedWebappClassLoader.java:119)
at org.springframework.boot.web.embedded.tomcat.TomcatEmbeddedWebappClassLoader.doLoadClass(TomcatEmbeddedWebappClassLoader.java:84)
at …Run Code Online (Sandbox Code Playgroud) java ×5
spring-boot ×5
tomcat ×3
spring ×2
gradle ×1
keep-alive ×1
node.js ×1
performance ×1
spring-mvc ×1
tomcat10 ×1