我使用DropWizard框架创建了一个RestFul应用程序,在提供了大约20个请求后,应用程序才停止响应。在记录文件中找不到错误/异常条目。
我发现,通过管理控制分析统计数据 jvm.threads.waiting.count = 47随着每个新请求不断增加。
应用程序中没有实现多线程,因此应用程序无法进入等待状态。
此外,如果我重新启动应用程序,它工作正常。
以下是其中一个未收到回复的请求的标题
*152226 INFO c.s.j.a.c.filter.LoggingFilter - 22 * Server in-bound request*
*22 > POST http://text.com/quotes*
*22 > Accept-Language: en-US,en;q=0.5*
*22 > Host: localhost:8080*
*22 > Content-Length: 1041*
*22 > Accept-Encoding: gzip, deflate*
*22 > User-Agent: Mozilla/5.0 (X11; Linux i686 on x86_64; rv:34.0) *Gecko/20100101Firefox/34.0*
*22 > Trace-Id: kiki-12345*
*22 > Connection: keep-alive*
请求数据未故意共享。
甚至无法弄清楚由于netstat造成的原因。
我想知道这是应用程序级问题还是由于DropWizard应用程序配置不正确而引起的问题?
管理部分的完整统计信息如下所示,我也有兴趣了解以下每个数据,并请求分享解释这些字段的链接。
===========================
{
"version": "3.0.0",
"gauges": {
"jvm.buffers.direct.capacity": {
"value": 1466889
},
"jvm.buffers.direct.count": {
"value": 116
},
"jvm.buffers.direct.used": {
"value": 1466990
},
"jvm.buffers.mapped.capacity": {
"value": 0
},
"jvm.buffers.mapped.count": {
"value": 0
},
"jvm.buffers.mapped.used": {
"value": 0
},
"jvm.gc.PS-MarkSweep.count": {
"value": 16
},
"jvm.gc.PS-MarkSweep.time": {
"value": 1354
},
"jvm.gc.PS-Scavenge.count": {
"value": 21
},
"jvm.gc.PS-Scavenge.time": {
"value": 153
},
"jvm.memory.heap.committed": {
"value": 177733632
},
"jvm.memory.heap.init": {
"value": 64984960
},
"jvm.memory.heap.max": {
"value": 924844032
},
"jvm.memory.heap.usage": {
"value": 0.02400968728962939
},
"jvm.memory.heap.used": {
"value": 22205216
},
"jvm.memory.non-heap.committed": {
"value": 50266112
},
"jvm.memory.non-heap.init": {
"value": 24576000
},
"jvm.memory.non-heap.max": {
"value": 136314880
},
"jvm.memory.non-heap.usage": {
"value": 0.30244334294245795
},
"jvm.memory.non-heap.used": {
"value": 41227528
},
"jvm.memory.pools.Code-Cache.usage": {
"value": 0.03484217325846354
},
"jvm.memory.pools.PS-Eden-Space.usage": {
"value": 0.027302608311733353
},
"jvm.memory.pools.PS-Old-Gen.usage": {
"value": 0.018778225297105475
},
"jvm.memory.pools.PS-Perm-Gen.usage": {
"value": 0.45908793007455223
},
"jvm.memory.pools.PS-Survivor-Space.usage": {
"value": 0
},
"jvm.memory.total.committed": {
"value": 227999744
},
"jvm.memory.total.init": {
"value": 89560960
},
"jvm.memory.total.max": {
"value": 1061158912
},
"jvm.memory.total.used": {
"value": 63434984
},
"jvm.threads.blocked.count": {
"value": 0
},
"jvm.threads.count": {
"value": 78
},
"jvm.threads.daemon.count": {
"value": 8
},
"jvm.threads.deadlocks": {
"value": [ ]
},
"jvm.threads.new.count": {
"value": 0
},
"jvm.threads.runnable.count": {
"value": 23
},
"jvm.threads.terminated.count": {
"value": 0
},
"jvm.threads.timed_waiting.count": {
"value": 8
},
"jvm.threads.waiting.count": {
"value": 47
},
"org.eclipse.jetty.util.thread.QueuedThreadPool.dw.jobs": {
"value": 0
},
"org.eclipse.jetty.util.thread.QueuedThreadPool.dw.size": {
"value": 33
},
"org.eclipse.jetty.util.thread.QueuedThreadPool.dw.utilization": {
"value": 0.9696969696969697
}
},
"counters": {
"io.dropwizard.jetty.MutableServletContextHandler.active-dispatches": {
"count": 28
},
"io.dropwizard.jetty.MutableServletContextHandler.active-requests": {
"count": 28
},
"io.dropwizard.jetty.MutableServletContextHandler.active-suspended": {
"count": 0
}
},
"histograms": { },
"meters": {
"ch.qos.logback.core.Appender.all": {
"count": 1,
"m15_rate": 7.747995257374595e-22,
"m1_rate": 0.008714462773784218,
"m5_rate": 0.000016544813111326462,
"mean_rate": 0.00035368404453324113,
"units": "events/second"
},
"ch.qos.logback.core.Appender.debug": {
"count": 0,
"m15_rate": 0,
"m1_rate": 0,
"m5_rate": 0,
"mean_rate": 0,
"units": "events/second"
},
"ch.qos.logback.core.Appender.error": {
"count": 0,
"m15_rate": 0,
"m1_rate": 0,
"m5_rate": 0,
"mean_rate": 0,
"units": "events/second"
},
"ch.qos.logback.core.Appender.info": {
"count": 1,
"m15_rate": 7.747995257374595e-22,
"m1_rate": 0.008714462773784218,
"m5_rate": 0.000016544813111326462,
"mean_rate": 0.00035368403287775683,
"units": "events/second"
},
"ch.qos.logback.core.Appender.trace": {
"count": 0,
"m15_rate": 0,
"m1_rate": 0,
"m5_rate": 0,
"mean_rate": 0,
"units": "events/second"
},
"ch.qos.logback.core.Appender.warn": {
"count": 0,
"m15_rate": 0,
"m1_rate": 0,
"m5_rate": 0,
"mean_rate": 0,
"units": "events/second"
},
"io.dropwizard.jetty.MutableServletContextHandler.1xx-responses": {
"count": 0,
"m15_rate": 0,
"m1_rate": 0,
"m5_rate": 0,
"mean_rate": 0,
"units": "events/second"
},
"io.dropwizard.jetty.MutableServletContextHandler.2xx-responses": {
"count": 13,
"m15_rate": 4.94961760464336e-10,
"m1_rate": 0.0034421634791656336,
"m5_rate": 0.000711983613661116,
"mean_rate": 0.004598973132381405,
"units": "events/second"
},
"io.dropwizard.jetty.MutableServletContextHandler.3xx-responses": {
"count": 0,
"m15_rate": 0,
"m1_rate": 0,
"m5_rate": 0,
"mean_rate": 0,
"units": "events/second"
},
"io.dropwizard.jetty.MutableServletContextHandler.4xx-responses": {
"count": 3,
"m15_rate": 2.5736064313211317e-20,
"m1_rate": 0.00018660583536242524,
"m5_rate": 0.0000018719139194908126,
"mean_rate": 0.0010613014574099948,
"units": "events/second"
},
"io.dropwizard.jetty.MutableServletContextHandler.5xx-responses": {
"count": 3,
"m15_rate": 1.3432085553605237e-10,
"m1_rate": 0.0008942559715277348,
"m5_rate": 0.00019309079729952434,
"mean_rate": 0.001061301432161492,
"units": "events/second"
},
"io.dropwizard.jetty.MutableServletContextHandler.async-dispatches": {
"count": 0,
"m15_rate": 0,
"m1_rate": 0,
"m5_rate": 0,
"mean_rate": 0,
"units": "events/second"
},
"io.dropwizard.jetty.MutableServletContextHandler.async-timeouts": {
"count": 0,
"m15_rate": 0,
"m1_rate": 0,
"m5_rate": 0,
"mean_rate": 0,
"units": "events/second"
}
},
"timers": {
"com.flightnetwork.insurance.resource.Book.book": {
"count": 0,
"max": 0,
"mean": 0,
"min": 0,
"p50": 0,
"p75": 0,
"p95": 0,
"p98": 0,
"p99": 0,
"p999": 0,
"stddev": 0,
"m15_rate": 0,
"m1_rate": 0,
"m5_rate": 0,
"mean_rate": 0,
"duration_units": "seconds",
"rate_units": "calls/second"
},
"com.flightnetwork.insurance.resource.Policies.doSearch": {
"count": 0,
"max": 0,
"mean": 0,
"min": 0,
"p50": 0,
"p75": 0,
"p95": 0,
"p98": 0,
"p99": 0,
"p999": 0,
"stddev": 0,
"m15_rate": 0,
"m1_rate": 0,
"m5_rate": 0,
"mean_rate": 0,
"duration_units": "seconds",
"rate_units": "calls/second"
},
"com.flightnetwork.insurance.resource.Quote.getQuote": {
"count": 16,
"max": 2.218201954,
"mean": 0.5852605546875,
"min": 0.36994936300000003,
"p50": 0.468106361,
"p75": 0.533698946,
"p95": 2.218201954,
"p98": 2.218201954,
"p99": 2.218201954,
"p999": 2.218201954,
"stddev": 0.4414850207038381,
"m15_rate": 6.29282616000388e-10,
"m1_rate": 0.004336419450693371,
"m5_rate": 0.0009050744109606403,
"mean_rate": 0.005660256743426155,
"duration_units": "seconds",
"rate_units": "calls/second"
},
"com.flightnetwork.insurance.resource.Refund.doRefund": {
"count": 0,
"max": 0,
"mean": 0,
"min": 0,
"p50": 0,
"p75": 0,
"p95": 0,
"p98": 0,
"p99": 0,
"p999": 0,
"stddev": 0,
"m15_rate": 0,
"m1_rate": 0,
"m5_rate": 0,
"mean_rate": 0,
"duration_units": "seconds",
"rate_units": "calls/second"
},
"io.dropwizard.jetty.MutableServletContextHandler.connect-requests": {
"count": 0,
"max": 0,
"mean": 0,
"min": 0,
"p50": 0,
"p75": 0,
"p95": 0,
"p98": 0,
"p99": 0,
"p999": 0,
"stddev": 0,
"m15_rate": 0,
"m1_rate": 0,
"m5_rate": 0,
"mean_rate": 0,
"duration_units": "seconds",
"rate_units": "calls/second"
},
"io.dropwizard.jetty.MutableServletContextHandler.delete-requests": {
"count": 0,
"max": 0,
"mean": 0,
"min": 0,
"p50": 0,
"p75": 0,
"p95": 0,
"p98": 0,
"p99": 0,
"p999": 0,
"stddev": 0,
"m15_rate": 0,
"m1_rate": 0,
"m5_rate": 0,
"mean_rate": 0,
"duration_units": "seconds",
"rate_units": "calls/second"
},
"io.dropwizard.jetty.MutableServletContextHandler.dispatches": {
"count": 19,
"max": 2.2550000000000003,
"mean": 0.5016315789473684,
"min": 0.001,
"p50": 0.46,
"p75": 0.528,
"p95": 2.2550000000000003,
"p98": 2.2550000000000003,
"p99": 2.2550000000000003,
"p999": 2.2550000000000003,
"stddev": 0.463604622080103,
"m15_rate": 6.292826160261246e-10,
"m1_rate": 0.004523025286055793,
"m5_rate": 0.0009069463248801308,
"mean_rate": 0.006721571867253656,
"duration_units": "seconds",
"rate_units": "calls/second"
},
"io.dropwizard.jetty.MutableServletContextHandler.get-requests": {
"count": 3,
"max": 0.05,
"mean": 0.017666666666666667,
"min": 0.001,
"p50": 0.002,
"p75": 0.05,
"p95": 0.05,
"p98": 0.05,
"p99": 0.05,
"p999": 0.05,
"stddev": 0.028005951748393293,
"m15_rate": 2.5736064313211317e-20,
"m1_rate": 0.00018660583536242524,
"m5_rate": 0.0000018719139194908126,
"mean_rate": 0.001061300945529201,
"duration_units": "seconds",
"rate_units": "calls/second"
},
"io.dropwizard.jetty.MutableServletContextHandler.head-requests": {
"count": 0,
"max": 0,
"mean": 0,
"min": 0,
"p50": 0,
"p75": 0,
"p95": 0,
"p98": 0,
"p99": 0,
"p999": 0,
"stddev": 0,
"m15_rate": 0,
"m1_rate": 0,
"m5_rate": 0,
"mean_rate": 0,
"duration_units": "seconds",
"rate_units": "calls/second"
},
"io.dropwizard.jetty.MutableServletContextHandler.move-requests": {
"count": 0,
"max": 0,
"mean": 0,
"min": 0,
"p50": 0,
"p75": 0,
"p95": 0,
"p98": 0,
"p99": 0,
"p999": 0,
"stddev": 0,
"m15_rate": 0,
"m1_rate": 0,
"m5_rate": 0,
"mean_rate": 0,
"duration_units": "seconds",
"rate_units": "calls/second"
},
"io.dropwizard.jetty.MutableServletContextHandler.options-requests": {
"count": 0,
"max": 0,
"mean": 0,
"min": 0,
"p50": 0,
"p75": 0,
"p95": 0,
"p98": 0,
"p99": 0,
"p999": 0,
"stddev": 0,
"m15_rate": 0,
"m1_rate": 0,
"m5_rate": 0,
"mean_rate": 0,
"duration_units": "seconds",
"rate_units": "calls/second"
},
"io.dropwizard.jetty.MutableServletContextHandler.other-requests": {
"count": 0,
"max": 0,
"mean": 0,
"min": 0,
"p50": 0,
"p75": 0,
"p95": 0,
"p98": 0,
"p99": 0,
"p999": 0,
"stddev": 0,
"m15_rate": 0,
"m1_rate": 0,
"m5_rate": 0,
"mean_rate": 0,
"duration_units": "seconds",
"rate_units": "calls/second"
},
"io.dropwizard.jetty.MutableServletContextHandler.post-requests": {
"count": 16,
"max": 2.2560000000000002,
"mean": 0.5925625,
"min": 0.372,
"p50": 0.47200000000000003,
"p75": 0.5355000000000001,
"p95": 2.2560000000000002,
"p98": 2.2560000000000002,
"p99": 2.2560000000000002,
"p999": 2.2560000000000002,
"stddev": 0.4497823130878611,
"m15_rate": 6.29282616000388e-10,
"m1_rate": 0.004336419450693371,
"m5_rate": 0.0009050744109606403,
"mean_rate": 0.005660270596836139,
"duration_units": "seconds",
"rate_units": "calls/second"
},
"io.dropwizard.jetty.MutableServletContextHandler.put-requests": {
"count": 0,
"max": 0,
"mean": 0,
"min": 0,
"p50": 0,
"p75": 0,
"p95": 0,
"p98": 0,
"p99": 0,
"p999": 0,
"stddev": 0,
"m15_rate": 0,
"m1_rate": 0,
"m5_rate": 0,
"mean_rate": 0,
"duration_units": "seconds",
"rate_units": "calls/second"
},
"io.dropwizard.jetty.MutableServletContextHandler.requests": {
"count": 38,
"max": 2.2560000000000002,
"mean": 0.5017105263157895,
"min": 0.001,
"p50": 0.46,
"p75": 0.528,
"p95": 2.25505,
"p98": 2.2560000000000002,
"p99": 2.2560000000000002,
"p999": 2.2560000000000002,
"stddev": 0.4573666639487485,
"m15_rate": 1.2585652320522491e-9,
"m1_rate": 0.009046050572111585,
"m5_rate": 0.0018138926497602615,
"mean_rate": 0.013443138586906005,
"duration_units": "seconds",
"rate_units": "calls/second"
},
"io.dropwizard.jetty.MutableServletContextHandler.trace-requests": {
"count": 0,
"max": 0,
"mean": 0,
"min": 0,
"p50": 0,
"p75": 0,
"p95": 0,
"p98": 0,
"p99": 0,
"p999": 0,
"stddev": 0,
"m15_rate": 0,
"m1_rate": 0,
"m5_rate": 0,
"mean_rate": 0,
"duration_units": "seconds",
"rate_units": "calls/second"
},
"org.eclipse.jetty.server.HttpConnectionFactory.80.connections": {
"count": 37,
"max": 116.233045153,
"mean": 18.87723851451351,
"min": 0.078290967,
"p50": 0.570973454,
"p75": 33.0824538595,
"p95": 87.55158713740005,
"p98": 116.233045153,
"p99": 116.233045153,
"p999": 116.233045153,
"stddev": 32.65398107624642,
"m15_rate": 0.006718640480106826,
"m1_rate": 0.018519557829824465,
"m5_rate": 0.024412722112445752,
"mean_rate": 0.013086852776973062,
"duration_units": "seconds",
"rate_units": "calls/second"
}
}
}
========================
答案 0 :(得分:1)
如果您使用Jersey Client调用其他服务,请确保关闭响应 - 基础http连接池可能为空。
要找出线程在哪里等待,您需要生成一个线程转储(使用jvisualvm,jstack或kill -3)。一旦你知道线程在哪里等待,解决方案应该是显而易见的。
另外 - 你使用的是哪种版本的dropwizard?
答案 1 :(得分:1)
此问题有两个可能的原因:
来自this blog post的更多信息。
您可以使用netstat -a | grep CLOSE_WAIT | wc -l
来获取线程数。
您可以通过运行获取线程转储:
jps
然后查看应用程序的进程ID是什么,并将其传递给此命令:
要使用jstack获取线程转储,请运行以下命令:
jstack <pid>
每隔一段时间运行一次相同的命令并附加到同一文件。您需要多个转储,在时间上隔开以检测长时间运行的线程
jstack <pid> >> threaddumps.log
然后使用thread dump analyzer比较您的第一个转储和第二个转储,通过选择多个转储来查看哪些线程正在运行很长时间,右键单击并选择“查找长时间运行的线程”
您可能需要确保关闭ClientResponse,正如此处所做的那样:
public boolean isSessionActive(HttpServletRequest httpRequest) {
ClientResponse response = null;
try{
response = jerseyClient
.resource(url)
.type(APPLICATION_JSON_TYPE)
.header("Cookie", httpRequest.getHeader("Cookie"))
.get(ClientResponse.class);
return response.getStatus() == SC_OK;
}
finally {
if (response != null){
// #############################################
// This next line is the fix you're looking for!
// #############################################
response.close();
}
}
}
MultiThreadedHttpConnectionManager及其默认配置仅允许每个主机有2个并发请求!因此,如果您使用不同的请求数据不断地使用同一台服务器,那么您可能一次只能限制为2个活动请求。如果发生这两个请求需要很长时间才能完成,那么你就没有可用的连接,并且会获得WAIT。
这怎么可能发生?对我们来说,我们使用的是ApacheHttpClient和DropWizard 0.6.2,它在幕后创建了一个带有默认配置的MultiThreadedHttpConnectionManager - default configuration一次只允许2个并发的http连接)
我们认为我们正在通过配置来突破这个#up,但实际上它没有被使用,我们的服务器一次只处理2个请求; - )
请检查以下内容,确保它们符合您的期望值!
MultiThreadedHttpConnectionManager connectionManager = ...;
connectionManager.getParams().getDefaultMaxConnectionsPerHost();
connectionManager.getParams().getMaxTotalConnections();
答案 2 :(得分:0)
我遇到了同样的问题,这与数据库连接保持打开有关。
基本上我们正在使用JPA,并且在某些情况下我们会这样做
EntityManager em = factory.createEntityManager();
并忘了em.close
不捕获回滚也可能是相关的。
答案 3 :(得分:0)
这意味着活动请求被卡在某些资源上,可能是任何东西,内存泄漏,死锁等。
然后去检查每个客户端(列表可能很长),使用jstack,JMC进行线程转储,或者使用jconsole查找。
您将看到线程在被阻塞时等待。就我而言
"dw-4104 - POST /something" #4104 prio=5 os_prio=0 tid=0x00007f4f3c074000 nid=0x306c waiting on condition [0x00007f4db00ff000]
java.lang.Thread.State: WAITING (parking)
at sun.misc.Unsafe.park(Native Method)
- parking to wait for <0x000000041cb8f780> (a jersey.repackaged.com.google.common.util.concurrent.AbstractFuture$Sync)
at java.util.concurrent.locks.LockSupport.park(LockSupport.java:175)
at java.util.concurrent.locks.AbstractQueuedSynchronizer.parkAndCheckInterrupt(AbstractQueuedSynchronizer.java:836)
at java.util.concurrent.locks.AbstractQueuedSynchronizer.doAcquireSharedInterruptibly(AbstractQueuedSynchronizer.java:997)
at java.util.concurrent.locks.AbstractQueuedSynchronizer.acquireSharedInterruptibly(AbstractQueuedSynchronizer.java:1304)
at jersey.repackaged.com.google.common.util.concurrent.AbstractFuture$Sync.get(AbstractFuture.java:285)
at jersey.repackaged.com.google.common.util.concurrent.AbstractFuture.get(AbstractFuture.java:116)
at org.glassfish.jersey.servlet.internal.ResponseWriter.getResponseContext(ResponseWriter.java:299)
at org.glassfish.jersey.servlet.internal.ResponseWriter.callSendError(ResponseWriter.java:215)
at org.glassfish.jersey.servlet.internal.ResponseWriter.commit(ResponseWriter.java:194)
at org.glassfish.jersey.server.ContainerResponse.close(ContainerResponse.java:413)
at org.glassfish.jersey.server.ServerRuntime$Responder.writeResponse(ServerRuntime.java:784)
at org.glassfish.jersey.server.ServerRuntime$Responder.processResponse(ServerRuntime.java:444)
at org.glassfish.jersey.server.ServerRuntime$Responder.process(ServerRuntime.java:434)
at org.glassfish.jersey.server.ServerRuntime$2.run(ServerRuntime.java:329)
at org.glassfish.jersey.internal.Errors$1.call(Errors.java:271)
at org.glassfish.jersey.internal.Errors$1.call(Errors.java:267)
at org.glassfish.jersey.internal.Errors.process(Errors.java:315)
at org.glassfish.jersey.internal.Errors.process(Errors.java:297)
at org.glassfish.jersey.internal.Errors.process(Errors.java:267)
at org.glassfish.jersey.process.internal.RequestScope.runInScope(RequestScope.java:317)
at org.glassfish.jersey.server.ServerRuntime.process(ServerRuntime.java:305)
at org.glassfish.jersey.server.ApplicationHandler.handle(ApplicationHandler.java:1154)
at org.glassfish.jersey.servlet.WebComponent.serviceImpl(WebComponent.java:473)
at org.glassfish.jersey.servlet.WebComponent.service(WebComponent.java:427)
at org.glassfish.jersey.servlet.ServletContainer.service(ServletContainer.java:388)
at org.glassfish.jersey.servlet.ServletContainer.service(ServletContainer.java:341)
at org.glassfish.jersey.servlet.ServletContainer.service(ServletContainer.java:228)
at io.dropwizard.jetty.NonblockingServletHolder.handle(NonblockingServletHolder.java:49)
at org.eclipse.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1655)
at io.dropwizard.servlets.ThreadNameFilter.doFilter(ThreadNameFilter.java:35)
at org.eclipse.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1642)
at io.dropwizard.jersey.filter.AllowedMethodsFilter.handle(AllowedMethodsFilter.java:45)
at io.dropwizard.jersey.filter.AllowedMethodsFilter.doFilter(AllowedMethodsFilter.java:39)
at org.eclipse.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1642)
at org.eclipse.jetty.servlet.ServletHandler.doHandle(ServletHandler.java:533)
at org.eclipse.jetty.server.handler.ScopedHandler.nextHandle(ScopedHandler.java:255)
at org.eclipse.jetty.server.handler.ContextHandler.doHandle(ContextHandler.java:1253)
at org.eclipse.jetty.server.handler.ScopedHandler.nextScope(ScopedHandler.java:203)
at org.eclipse.jetty.servlet.ServletHandler.doScope(ServletHandler.java:473)
at org.eclipse.jetty.server.handler.ScopedHandler.nextScope(ScopedHandler.java:201)
at org.eclipse.jetty.server.handler.ContextHandler.doScope(ContextHandler.java:1155)
at org.eclipse.jetty.server.handler.ScopedHandler.handle(ScopedHandler.java:144)
at org.eclipse.jetty.server.handler.HandlerWrapper.handle(HandlerWrapper.java:132)
at com.codahale.metrics.jetty9.InstrumentedHandler.handle(InstrumentedHandler.java:239)
at io.dropwizard.jetty.RoutingHandler.handle(RoutingHandler.java:52)
at org.eclipse.jetty.server.handler.gzip.GzipHandler.handle(GzipHandler.java:674)
at io.dropwizard.jetty.BiDiGzipHandler.handle(BiDiGzipHandler.java:67)
at org.eclipse.jetty.server.handler.RequestLogHandler.handle(RequestLogHandler.java:56)
at org.eclipse.jetty.server.handler.StatisticsHandler.handle(StatisticsHandler.java:169)
at org.eclipse.jetty.server.handler.HandlerWrapper.handle(HandlerWrapper.java:132)
at org.eclipse.jetty.server.Server.handle(Server.java:531)
at org.eclipse.jetty.server.HttpChannel.handle(HttpChannel.java:352)
at org.eclipse.jetty.server.HttpConnection.onFillable(HttpConnection.java:260)
at org.eclipse.jetty.io.AbstractConnection$ReadCallback.succeeded(AbstractConnection.java:281)
at org.eclipse.jetty.io.FillInterest.fillable(FillInterest.java:102)
at org.eclipse.jetty.io.ChannelEndPoint$2.run(ChannelEndPoint.java:118)
at org.eclipse.jetty.util.thread.strategy.EatWhatYouKill.runTask(EatWhatYouKill.java:333)
at org.eclipse.jetty.util.thread.strategy.EatWhatYouKill.doProduce(EatWhatYouKill.java:310)
at org.eclipse.jetty.util.thread.strategy.EatWhatYouKill.tryProduce(EatWhatYouKill.java:168)
at org.eclipse.jetty.util.thread.strategy.EatWhatYouKill.run(EatWhatYouKill.java:126)
at org.eclipse.jetty.util.thread.ReservedThreadExecutor$ReservedThread.run(ReservedThreadExecutor.java:366)
at org.eclipse.jetty.util.thread.QueuedThreadPool.runJob(QueuedThreadPool.java:760)
at org.eclipse.jetty.util.thread.QueuedThreadPool$2.run(QueuedThreadPool.java:678)
at java.lang.Thread.run(Thread.java:745)
以上内容正在等待写入客户端的响应。显然,我们正在重用响应对象,该对象在第一次响应中就被消耗了,随后的请求在响应时被阻塞。