未收到 Apache HttpAsyncClient 响应
Apache HttpAsyncClient response not received
在我的 servlet 中,我正在执行以下代码:
RequestConfig requestConfig = RequestConfig.custom().setSocketTimeout(3000).setConnectTimeout(3000).build();
CloseableHttpAsyncClient client = HttpAsyncClients.custom().setDefaultRequestConfig(requestConfig).build();
try
{
client.start();
for (String request : preparedURLs)
{
client.execute(new HttpGet(request), new FutureCallback<HttpResponse>()
{
public void failed(Exception ex)
{
System.out.println("\n\nRequest Failed Due to : " + ex.getMessage());
}
public void completed(HttpResponse response)
{
System.out.println("\n\nRequest COMPLETED");
}
public void cancelled()
{
System.out.println("\n\nRequest CANCELLED");
}
});
System.out.println("\n\n" + request);
}
}
finally
{
System.out.println("\n*** Finally called ***\n\n");
client.close();
}
但是我根本没有收到任何回复。以下是打印在我的 catalina.out
:
http://localhost:8080/servlet/?ps=true
http://localhost:8080/servlet/?ps=true
http://localhost:8080/servlet/?ps=false
*** Finally called ***
这段代码是我写的,以this为例来自apache官网
我只省略了latch部分。这与闩锁有关吗?
如果可以的话也请说明失败的原因。
您删除的这个闩锁实际上是示例的同步部分。
异步客户端的思想是发出一些请求并等待其他线程的响应。通过删除同步,执行直接传递到 finally 块,而不是等待响应并关闭 HttpAsyncClient。
为了让它恢复工作,添加示例中的闩锁代码。
这是正确的行为。您正在创建一个带有条件 Future 的套接字,然后您继续关闭它而不等待它。
您链接的示例代码使用 "latch" 变量来执行此操作。
您可以在未来的回调中移动关闭代码,但这可能会混淆您的警告。
或者您可以使用示例的相同系统,使用共享的同步计数器(可能只是一个由 aswer 触发的最终 AtomicBoolean)并在继续您的程序流程之前等待它,但这破坏了使用异步调用的想法
在我的 servlet 中,我正在执行以下代码:
RequestConfig requestConfig = RequestConfig.custom().setSocketTimeout(3000).setConnectTimeout(3000).build();
CloseableHttpAsyncClient client = HttpAsyncClients.custom().setDefaultRequestConfig(requestConfig).build();
try
{
client.start();
for (String request : preparedURLs)
{
client.execute(new HttpGet(request), new FutureCallback<HttpResponse>()
{
public void failed(Exception ex)
{
System.out.println("\n\nRequest Failed Due to : " + ex.getMessage());
}
public void completed(HttpResponse response)
{
System.out.println("\n\nRequest COMPLETED");
}
public void cancelled()
{
System.out.println("\n\nRequest CANCELLED");
}
});
System.out.println("\n\n" + request);
}
}
finally
{
System.out.println("\n*** Finally called ***\n\n");
client.close();
}
但是我根本没有收到任何回复。以下是打印在我的 catalina.out
:
http://localhost:8080/servlet/?ps=true
http://localhost:8080/servlet/?ps=true
http://localhost:8080/servlet/?ps=false
*** Finally called ***
这段代码是我写的,以this为例来自apache官网
我只省略了latch部分。这与闩锁有关吗?
如果可以的话也请说明失败的原因。
您删除的这个闩锁实际上是示例的同步部分。
异步客户端的思想是发出一些请求并等待其他线程的响应。通过删除同步,执行直接传递到 finally 块,而不是等待响应并关闭 HttpAsyncClient。
为了让它恢复工作,添加示例中的闩锁代码。
这是正确的行为。您正在创建一个带有条件 Future 的套接字,然后您继续关闭它而不等待它。 您链接的示例代码使用 "latch" 变量来执行此操作。 您可以在未来的回调中移动关闭代码,但这可能会混淆您的警告。 或者您可以使用示例的相同系统,使用共享的同步计数器(可能只是一个由 aswer 触发的最终 AtomicBoolean)并在继续您的程序流程之前等待它,但这破坏了使用异步调用的想法