我们有一个包含很多组件的客户端/服务器 Web 应用程序——包括代理中的 AsyncContext 和 ning AsyncHttpClient——我只是想弄清楚超时和重试(以及 startAsync/complete)是如何工作的。这是完整的结构(简化)...
GWT 2.7 应用程序响应操作(例如,按钮单击)调用应用程序服务器上的 servlet,该 servlet 通过我们的代理 servlet 到另一个主机以执行长时间运行的任务。在开发中,我们使用嵌入式码头服务器运行/调试 GWT 应用程序 - 在生产中,我们将战争部署到 tomcat7。
第一个 servlet 使用 RestEasy 3.0.8(和 ApacheHttpClient4Executor)来创建通过我们的代理 servlet 的调用。我们使用 ning AsyncHttpClient 1.7.5、startAsync/complete 和 AsyncHandler 来调用远程主机上的服务器(也使用 RestEasy)。这是由我目前无法咨询的其他人设置的。
我不确定何时调用 complete() 或如何停止/启用重试。两个更大的问题是,如果我们在超时时/前后完成()(在上下文超时的代理内或对 [AsyncResponse] 超时的远程服务器的调用),我们经常会得到 IllegalStateException(IDLE,initial);并且......当上下文超时发生时,Jetty 似乎完全重新启动请求(在代理中),我们没有明显的方法来检查这种情况是否正在发生或(智能地)停止它等等。所以如果调用是使用输入流,第二次/重试使用相同的输入流,这会导致远程服务器在第二次调用时抛出 EOF 异常(因为没有剩余字节要读取),同时继续处理它收到的第一个调用。
我尝试过/学到的...
RestEasy/ApacheHttpClient4Executor 调用似乎永远不会超时(因此设置重试并不重要) - 它要么成功,要么失败,取决于调用另一端发生的情况(并且似乎永远等待)......例子...
HttpParams 参数 = client.getParams(); HttpConnectionParams.setConnectionTimeout(params, 5000); HttpConnectionParams.setSoTimeout(params, 5000);
((AbstractHttpClient) 客户端).setHttpRequestRetryHandler(new DefaultHttpRequestRetryHandler(3, true));
AsyncHttpClientConfig 上的 setConnectionTimeoutInMs() 似乎什么也没做(除非它只是建立服务器连接需要多长时间 - 我认为它包括完整的请求时间)
如果我以超时启动Async 并执行请求,如果/当它在请求完成之前超时,那么上下文侦听器将收到一个 onTimeout 事件,并且 Jetty 将重新启动整个请求(导致侦听器也收到一个 onStartAsync 事件相同的上下文)。Tomcat 不这样做。另一个人似乎遇到了同样的事情,但没有回复......
http://dev.eclipse.org/mhonarc/lists/jetty-dev/msg02269.html
在 onTimeout 中调用 complete() 会停止第二个请求。而是在 onStartAsync 中调用 complete() 会产生奇怪的结果(第二次调用仍然发生,并且 AsyncHandler 中的 onComplete 在某个时候被调用,但随后它会引发 IllegalStateException 导致 onThrowable 被调用 [??])
在此配置中在 AsyncHttpClient 上设置重试似乎没有任何作用(除非它只发生在 asyncTimeout、requestTimeout 等的某种组合上——我还没有弄清楚)
设置响应状态(例如设置为 408)似乎在极少数情况下有效,但由于服务器上的 EOF 异常生成 500 并返回给客户端而我无法做很多事情(第一次调用)仍在进行中,我不知道这是第二次调用 [除了它失败] 或者它是由于超时等而发生的)
可以从 AsyncContext 上的方法收集到的信息很少。我可以使用反射来获取一些我可以使用的数据,但没有它......我怎么知道它是否被重试?我怎么知道是什么状态来决定是否调用complete()?等等等等
关于 AsyncContext (et al) 的在线信息似乎很少,令人困惑的 javadoc,并且只有关于 SO 的小/孤立的修复建议。到目前为止,我遇到的最好的是:
底线:任何人都可以解释或指出关于 AsynContext/AsyncHandler 如何工作和/或如何正确使用它和/或帮助我理解我在这里看到的内容的好文档。谢谢!