我们有一个客户端/服务器网络应用程序,其中包含很多组件 - 包括我们代理中的AsyncContext和ning AsyncHttpClient - 我只想弄清楚超时和重试(以及startAsync / complete)是如何工作的。这是完整的结构(简化)......
GWT 2.7应用程序响应一个动作(例如,按钮单击)调用应用程序服务器上的servlet,该服务器通过我们的代理servlet到另一个主机执行长时间运行的任务。在开发中,我们使用嵌入式jetty服务器运行/调试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异常(因为没有剩余的字节可读),同时继续处理它接收的第一次调用。这些都是我们开发环境中Jetty的问题,但我想了解这一点,以便在tomcat / production上做正确的事。
我尝试过的东西......
RestEasy / ApacheHttpClient4Executor调用似乎永远不会超时(因此设置重试并不重要) - 根据调用的另一端发生的情况,它会成功还是失败(和看似永远等待......例如......
HttpParams params = client.getParams(); HttpConnectionParams.setConnectionTimeout(params,5000); HttpConnectionParams.setSoTimeout(params,5000);
((AbstractHttpClient)client).setHttpRequestRetryHandler(new DefaultHttpRequestRetryHandler(3,true));
AsyncHttpClientConfig上的setConnectionTimeoutInMs()似乎什么也没做(除非它只是关于服务器连接需要多长时间 - 我认为它包括完整的请求时间)
如果我使用超时startAsync并执行请求,如果/当它在请求完成之前超时,则上下文侦听器将获得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等的某些组合上 - 我还没弄清楚)
< / LI>设置响应状态(例如408)似乎在极少数情况下有效,但通常不是由于服务器上的EOF异常导致500回到客户端而没有我能够做多少关于它(第一个电话仍然在进行中,我不知道这是第二个电话[除了它失败]或者是由于超时等原因而发生的)
可以从AsyncContext上的方法收集很少的信息。我可以使用反射来获取我可以使用的一些数据但是没有...我怎么知道它是否已被重试?我怎么知道确定是否调用complete()是什么状态?等等
似乎很少有关于AsyncContext(等)的在线信息,令人困惑的javadoc,以及只有SO上的小/隔离修复建议。到目前为止,我遇到的最好的是:
结论:任何人都可以向我解释或指出有关AsynContext / AsyncHandler如何工作和/或如何正确使用它的好文档和/或帮助我理解我在这里看到的内容。谢谢!