Apache Async HTTP使用每个请求的新代理发送请求

时间:2019-02-22 09:39:04

标签: java asynchronous apache-httpclient-4.x apache-httpasyncclient

我必须连续检查数千个代理服务器。

为了加快速度,我正在考虑创建一批大小为N(例如50)并同时向其发送请求。每个代理服务器都有唯一的IP /端口和用户名/密码验证。

由于我正在检查代理,因此我将配置请求以使用给定的代理,并将请求发送到目标站点并评估响应。

以下是将Apache客户端文档中的auth与代理一起使用的示例:

 public static void main(String[] args)throws Exception {
        CredentialsProvider credsProvider = new BasicCredentialsProvider();
        credsProvider.setCredentials(
                new AuthScope("localhost", 8889),
                new UsernamePasswordCredentials("squid", "nopassword"));
        CloseableHttpAsyncClient httpclient = HttpAsyncClients.custom()
                .setDefaultCredentialsProvider(credsProvider)
                .build();
        try {
            httpclient.start();
            HttpHost proxy = new HttpHost("localhost", 8889);
            RequestConfig config = RequestConfig.custom()
                    .setProxy(proxy)
                    .build();
            HttpGet httpget = new HttpGet("https://httpbin.org/");
            httpget.setConfig(config);
            Future<HttpResponse> future = httpclient.execute(httpget, null);
            HttpResponse response = future.get();
            System.out.println("Response: " + response.getStatusLine());
            System.out.println("Shutting down");
        } finally {
            httpclient.close();
        }
    }

如您所见,如果您使用的是经过身份验证的代理,则需要在客户端本身中提供凭据。 这意味着如果我要同时检查50个代理服务器,则必须为每个代理服务器创建一个新客户端。这意味着如果我仅使用多线程解决方案,请求将不会是并发的,并且会更好。

问题是,如果我使用多线程,那么由于大多数线程将阻塞I / O,因此我将在服务器上施加过多的负载。对于这种类型的挑战,并发非阻塞I / O要好得多。

如果必须为每个认证的代理服务器创建一个客户端,如何同时检查多个认证的代理服务器?

0 个答案:

没有答案