未收到Apache HttpAsyncClient响应

时间:2015-02-16 16:01:35

标签: java servlets apache-httpclient-4.x

在我的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 ***

我已经编写了这段代码,以apache的官方网站为例,以this为例。

我只省略了闩锁部分。这与闩锁有关吗?

如果可能,请解释失败的原因。

2 个答案:

答案 0 :(得分:1)

您已删除的此锁存器实际上是示例的同步部分。

异步客户端的想法是发出一些请求并等待其他线程上的响应。通过删除同步,执行直接传递给finally块,而不是等待响应并关闭HttpAsyncClient。

为了让它恢复工作,请添加示例中的锁存代码。

答案 1 :(得分:0)

这是正确的行为。您正在创建一个带有条件Future的套接字,然后继续关闭它而不等待它。 您链接的示例代码使用&#34; latch&#34;变量这样做。 您可以在将来的回调中移动关闭代码,但这可能会使您的警告感到困惑。 或者您可以使用该示例的相同系统,使用共享同步计数器(可能只是由aswer触发的最终AtomicBoolean)并在继续您的程序流之前等待它,但这会破坏使用异步调用的想法