【发布时间】:2016-05-03 14:00:54
【问题描述】:
Jetty 在上传分段文件和连接中断时占用 100% CPU
我们目前正在使用嵌入式 Jetty Server + Spring MVC 上传文件。 当我使用 curl 手动上传文件并故意使用 Ctrl^C 将其中断时,服务器上的 CPU 达到 100%,只有重新启动应用程序才能解决此问题。
curl -i -X POST -H "Content-Type: multipart/form-data" -F "param1=bla" -F "file=@a_file" http://myserver/bla/submit
我查看了其他解决此问题的帖子,但通常可以通过更新 Jetty API 版本和 Java 8 来解决。我已经这样做了,但同样的问题正在发生。可能和春天有关?
API:
- 码头:9.3.6.v20151106
- JRE:1.8_65(我没有使用JDK来运行应用程序)
- Spring MVC:3.2.15
这是该方法的代码sn-p:
@RequestMapping(
value = MY_PATH,
method = RequestMethod.POST)
public
@ResponseBody
void submitFile(
@NotNull @RequestParam("param1") String param1,
@NotNull @RequestParam("file") MultipartFile file) {
//No code gets executed
}
我已经使用 Java Visual VM 来监视并找到导致问题的线程转储:
"qtp529864074-68" - Thread t@68
java.lang.Thread.State: RUNNABLE
at sun.nio.ch.FileDispatcherImpl.writev0(Native Method)
at sun.nio.ch.SocketDispatcher.writev(SocketDispatcher.java:51)
at sun.nio.ch.IOUtil.write(IOUtil.java:148)
at sun.nio.ch.SocketChannelImpl.write(SocketChannelImpl.java:504)
- locked <6ddac168> (a java.lang.Object)
at org.eclipse.jetty.io.ChannelEndPoint.flush(ChannelEndPoint.java:177)
at org.eclipse.jetty.io.WriteFlusher.flush(WriteFlusher.java:419)
at org.eclipse.jetty.io.WriteFlusher.write(WriteFlusher.java:313)
at org.eclipse.jetty.io.AbstractEndPoint.write(AbstractEndPoint.java:141)
at org.eclipse.jetty.server.HttpConnection$SendCallback.process(HttpConnection.java:735)
at org.eclipse.jetty.util.IteratingCallback.processing(IteratingCallback.java:241)
at org.eclipse.jetty.util.IteratingCallback.iterate(IteratingCallback.java:224)
at org.eclipse.jetty.server.HttpConnection.send(HttpConnection.java:509)
at org.eclipse.jetty.server.HttpChannel.sendResponse(HttpChannel.java:668)
at org.eclipse.jetty.server.HttpChannel.write(HttpChannel.java:722)
at org.eclipse.jetty.server.HttpOutput.write(HttpOutput.java:177)
at org.eclipse.jetty.server.HttpOutput.write(HttpOutput.java:163)
at org.eclipse.jetty.server.HttpOutput.write(HttpOutput.java:441)
at org.eclipse.jetty.util.ByteArrayISO8859Writer.writeTo(ByteArrayISO8859Writer.java:109)
at org.eclipse.jetty.server.Response.sendError(Response.java:606)
at org.eclipse.jetty.server.Response.sendError(Response.java:512)
at org.eclipse.jetty.servlet.ServletHandler.doHandle(ServletHandler.java:650)
at org.eclipse.jetty.server.handler.ScopedHandler.handle(ScopedHandler.java:143)
at org.eclipse.jetty.security.SecurityHandler.handle(SecurityHandler.java:548)
at org.eclipse.jetty.server.handler.ContextHandler.doHandle(ContextHandler.java:1160)
at org.eclipse.jetty.servlet.ServletHandler.doScope(ServletHandler.java:511)
at org.eclipse.jetty.server.handler.ContextHandler.doScope(ContextHandler.java:1090)
at org.eclipse.jetty.server.handler.ScopedHandler.handle(ScopedHandler.java:141)
at org.eclipse.jetty.server.handler.ContextHandlerCollection.handle(ContextHandlerCollection.java:213)
at org.eclipse.jetty.server.handler.HandlerCollection.handle(HandlerCollection.java:109)
at org.eclipse.jetty.server.handler.HandlerWrapper.handle(HandlerWrapper.java:119)
at org.eclipse.jetty.server.Server.handle(Server.java:517)
at org.eclipse.jetty.server.HttpChannel.handle(HttpChannel.java:308)
at org.eclipse.jetty.server.HttpConnection.onFillable(HttpConnection.java:242)
at org.eclipse.jetty.io.AbstractConnection$ReadCallback.succeeded(AbstractConnection.java:261)
at org.eclipse.jetty.io.FillInterest.fillable(FillInterest.java:95)
at org.eclipse.jetty.io.SelectChannelEndPoint$2.run(SelectChannelEndPoint.java:75)
at org.eclipse.jetty.util.thread.strategy.ExecuteProduceConsume.produceAndRun(ExecuteProduceConsume.java:213)
at org.eclipse.jetty.util.thread.strategy.ExecuteProduceConsume.run(ExecuteProduceConsume.java:147)
at org.eclipse.jetty.util.thread.QueuedThreadPool.runJob(QueuedThreadPool.java:654)
at org.eclipse.jetty.util.thread.QueuedThreadPool$3.run(QueuedThreadPool.java:572)
at java.lang.Thread.run(Thread.java:745)
【问题讨论】:
标签: java spring jetty embedded-jetty