Jetty:Spring Boot 2 中 JSON 反序列化的空闲超时过期异常
Jetty: Idle timeout expired exception on JSON deserialization in Spring Boot 2
当 Spring Boot 2.0 服务器处理传入请求时,我偶尔会看到如下所示的堆栈跟踪。我正在使用 Spring Boot 2.2.4 和 spring-boot-starter-jetty。此异常仅发生大约 0.1% 的时间。有没有人见过类似的东西并且知道为什么会发生这种情况?该服务在应用程序负载均衡器后面的 AWS EKS 中 运行。
j.u.c.TimeoutException: Idle timeout expired: 30001/30000 ms
at o.e.j.io.IdleTimeout.checkIdleTimeout(IdleTimeout.java:171)
at o.e.j.io.IdleTimeout.idleCheck(IdleTimeout.java:113)
at j.u.c.Executors$RunnableAdapter.call(Executors.java:515)
at j.u.c.FutureTask.run(FutureTask.java:264)
at j.u.c.ScheduledThreadPoolExecutor$ScheduledFutureTask.run(ScheduledThreadPoolExecutor.java:304)
at j.u.c.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1128)
at j.u.c.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:628)
... 1 common frames omitted
Suppressed: java.lang.Throwable: HttpInput failure
at o.e.j.s.HttpInput.failed(HttpInput.java:830)
at o.e.j.s.HttpConnection$BlockingReadCallback.failed(HttpConnection.java:656)
at o.e.j.i.FillInterest.onFail(FillInterest.java:138)
at o.e.j.i.AbstractEndPoint.onIdleExpired(AbstractEndPoint.java:407)
... 8 common frames omitted
Wrapped by: java.io.IOException: java.util.concurrent.TimeoutException: Idle timeout expired: 30001/30000 ms
at o.e.j.s.HttpInput$ErrorState.noContent(HttpInput.java:1083)
at o.e.j.s.HttpInput.read(HttpInput.java:321)
at c.r.p.e.s.c.s.MeasurableRequestWrapper$CountingInputStream.read(MeasurableRequestWrapper.java:62)
at j.i.FilterInputStream.read(FilterInputStream.java:133)
at j.i.PushbackInputStream.read(PushbackInputStream.java:183)
at c.f.j.c.j.UTF8StreamJsonParser._loadMore(UTF8StreamJsonParser.java:220)
at c.f.j.c.j.UTF8StreamJsonParser.parseEscapedName(UTF8StreamJsonParser.java:1985)
at c.f.j.c.j.UTF8StreamJsonParser.parseLongName(UTF8StreamJsonParser.java:1872)
at c.f.j.c.j.UTF8StreamJsonParser.parseMediumName2(UTF8StreamJsonParser.java:1810)
at c.f.j.c.j.UTF8StreamJsonParser.parseMediumName(UTF8StreamJsonParser.java:1767)
at c.f.j.c.j.UTF8StreamJsonParser._parseName(UTF8StreamJsonParser.java:1702)
at c.f.j.c.j.UTF8StreamJsonParser.nextFieldName(UTF8StreamJsonParser.java:1029)
at c.f.j.d.d.s.MapDeserializer._readAndBindStringKeyMap(MapDeserializer.java:512)
at c.f.j.d.d.s.MapDeserializer.deserialize(MapDeserializer.java:364)
at c.f.j.d.d.s.MapDeserializer.deserialize(MapDeserializer.java:29)
at c.f.j.d.d.s.CollectionDeserializer.deserialize(CollectionDeserializer.java:286)
... 124 common frames omitted
Wrapped by: c.f.j.d.JsonMappingException: java.util.concurrent.TimeoutException: Idle timeout expired: 30001/30000 ms (through reference chain: com.abc.service.api.resources.SalesDataRequest["details"]->java.util.ArrayList[0]->com.abc.service.api.resources.SalesDataRequest$SalesDataDetail["events"]->java.util.ArrayList[2])
at c.f.j.d.JsonMappingException.wrapWithPath(JsonMappingException.java:394)
at c.f.j.d.JsonMappingException.wrapWithPath(JsonMappingException.java:365)
at c.f.j.d.d.s.CollectionDeserializer.deserialize(CollectionDeserializer...
您有一个连接在请求正文中提供数据(因此 HttpInput
引用)。
数据处于阻塞读取 (HttpInput.read()
) 等待更多数据。
然后该连接开始空闲超时,读取失败 HttpInput.noContent()
表示读取不完整,嵌套原因是空闲超时。
这是一个标准的空闲超时场景。
没有那么不寻常或非凡。
在移动客户端中很常见(移动塔切换、网络连接不良、从手机塔切换到 wifi 或再次切换回来等)。它甚至发生在笔记本电脑上的浏览器上(wifi 问题、浏览器崩溃、电池问题、盖子关闭、睡眠模式等)
事实上只有 1% 的请求会发生这种情况,这一点非常了不起(通常 public 面向网站的网络问题请求百分比更高)
当 Spring Boot 2.0 服务器处理传入请求时,我偶尔会看到如下所示的堆栈跟踪。我正在使用 Spring Boot 2.2.4 和 spring-boot-starter-jetty。此异常仅发生大约 0.1% 的时间。有没有人见过类似的东西并且知道为什么会发生这种情况?该服务在应用程序负载均衡器后面的 AWS EKS 中 运行。
j.u.c.TimeoutException: Idle timeout expired: 30001/30000 ms
at o.e.j.io.IdleTimeout.checkIdleTimeout(IdleTimeout.java:171)
at o.e.j.io.IdleTimeout.idleCheck(IdleTimeout.java:113)
at j.u.c.Executors$RunnableAdapter.call(Executors.java:515)
at j.u.c.FutureTask.run(FutureTask.java:264)
at j.u.c.ScheduledThreadPoolExecutor$ScheduledFutureTask.run(ScheduledThreadPoolExecutor.java:304)
at j.u.c.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1128)
at j.u.c.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:628)
... 1 common frames omitted
Suppressed: java.lang.Throwable: HttpInput failure
at o.e.j.s.HttpInput.failed(HttpInput.java:830)
at o.e.j.s.HttpConnection$BlockingReadCallback.failed(HttpConnection.java:656)
at o.e.j.i.FillInterest.onFail(FillInterest.java:138)
at o.e.j.i.AbstractEndPoint.onIdleExpired(AbstractEndPoint.java:407)
... 8 common frames omitted
Wrapped by: java.io.IOException: java.util.concurrent.TimeoutException: Idle timeout expired: 30001/30000 ms
at o.e.j.s.HttpInput$ErrorState.noContent(HttpInput.java:1083)
at o.e.j.s.HttpInput.read(HttpInput.java:321)
at c.r.p.e.s.c.s.MeasurableRequestWrapper$CountingInputStream.read(MeasurableRequestWrapper.java:62)
at j.i.FilterInputStream.read(FilterInputStream.java:133)
at j.i.PushbackInputStream.read(PushbackInputStream.java:183)
at c.f.j.c.j.UTF8StreamJsonParser._loadMore(UTF8StreamJsonParser.java:220)
at c.f.j.c.j.UTF8StreamJsonParser.parseEscapedName(UTF8StreamJsonParser.java:1985)
at c.f.j.c.j.UTF8StreamJsonParser.parseLongName(UTF8StreamJsonParser.java:1872)
at c.f.j.c.j.UTF8StreamJsonParser.parseMediumName2(UTF8StreamJsonParser.java:1810)
at c.f.j.c.j.UTF8StreamJsonParser.parseMediumName(UTF8StreamJsonParser.java:1767)
at c.f.j.c.j.UTF8StreamJsonParser._parseName(UTF8StreamJsonParser.java:1702)
at c.f.j.c.j.UTF8StreamJsonParser.nextFieldName(UTF8StreamJsonParser.java:1029)
at c.f.j.d.d.s.MapDeserializer._readAndBindStringKeyMap(MapDeserializer.java:512)
at c.f.j.d.d.s.MapDeserializer.deserialize(MapDeserializer.java:364)
at c.f.j.d.d.s.MapDeserializer.deserialize(MapDeserializer.java:29)
at c.f.j.d.d.s.CollectionDeserializer.deserialize(CollectionDeserializer.java:286)
... 124 common frames omitted
Wrapped by: c.f.j.d.JsonMappingException: java.util.concurrent.TimeoutException: Idle timeout expired: 30001/30000 ms (through reference chain: com.abc.service.api.resources.SalesDataRequest["details"]->java.util.ArrayList[0]->com.abc.service.api.resources.SalesDataRequest$SalesDataDetail["events"]->java.util.ArrayList[2])
at c.f.j.d.JsonMappingException.wrapWithPath(JsonMappingException.java:394)
at c.f.j.d.JsonMappingException.wrapWithPath(JsonMappingException.java:365)
at c.f.j.d.d.s.CollectionDeserializer.deserialize(CollectionDeserializer...
您有一个连接在请求正文中提供数据(因此 HttpInput
引用)。
数据处于阻塞读取 (HttpInput.read()
) 等待更多数据。
然后该连接开始空闲超时,读取失败 HttpInput.noContent()
表示读取不完整,嵌套原因是空闲超时。
这是一个标准的空闲超时场景。
没有那么不寻常或非凡。
在移动客户端中很常见(移动塔切换、网络连接不良、从手机塔切换到 wifi 或再次切换回来等)。它甚至发生在笔记本电脑上的浏览器上(wifi 问题、浏览器崩溃、电池问题、盖子关闭、睡眠模式等)
事实上只有 1% 的请求会发生这种情况,这一点非常了不起(通常 public 面向网站的网络问题请求百分比更高)