PoolingHttpClientConnectionManager-线程多于连接

时间:2020-08-02 08:36:31

标签: java apache-httpclient-4.x

在计算机上执行多个作业。对于每项工作,我都必须致电外部服务(另外还要做一些其他工作)。事先不知道要为作业调用外部服务的次数,甚至在作业开始时(由于作业处理涉及流输入数据),都不知道该次数。

在开始工作之前,我必须创建一定数量的线程进行处理-作为调用外部服务的处理的一部分。

说该服务仅支持100 TPS(每秒事务),并且一台机器上最多可以运行10个作业 而且我不想轰炸这项服务。

问题在于确定要为每个作业分配的工作线程数。由于在最坏的情况下一次可以运行10个作业,因此我可以为每个作业分配10个线程。但是,如果只有一项作业正在运行10个线程,那我将无法充分利用该服务。

我认为我可以使用PoolingHttpClientConnectionManager来池化线程并使用它们来访问服务。我可以使用DefaultMaxPerRouteMaxTotal作为100。

优势:当仅运行一项作业时,我可以充分利用外部服务。

问题是当10个作业正在运行时,将竞争1000个线程来调用该服务。为每个作业创建默认的100个线程是否可以,否则资源争用会导致问题吗?

更新:

了解到我将要使用的客户端必须没有连接请求超时才能从池中检出/租赁连接,否则它将抛出ConnectionPoolTimeoutException

1 个答案:

答案 0 :(得分:0)

我认为PoolingHttpClientConnectionManager仅作为池包含连接,因为它只是一个线程。还有用于连接到代码控件中网址的线程,例如:

public String doPost(HttpPost postMethod, ProfilerLog profilerLog, LogBuilder logBuilder)
            throws Exception {
        try {
            // execute thread
            ConnectorThread thread = new ConnectorThread(postMethod, httpClient, "Connector Thread",
                    profilerLog, logBuilder);
            thread.setDaemon(true);
            thread.start();

            // tunnel response
            thread.join();
            return thread.getRespData();
        } catch (Exception ex) {
            LOGGER.error(ex.getMessage(), ex);
            return null;
        } finally {
            shutdown();
        }
    }

ConnectorThread执行目标网址。

致谢。