在计算机上执行多个作业。对于每项工作,我都必须致电外部服务(另外还要做一些其他工作)。事先不知道要为作业调用外部服务的次数,甚至在作业开始时(由于作业处理涉及流输入数据),都不知道该次数。
在开始工作之前,我必须创建一定数量的线程进行处理-作为调用外部服务的处理的一部分。
说该服务仅支持100 TPS(每秒事务),并且一台机器上最多可以运行10个作业 而且我不想轰炸这项服务。
问题在于确定要为每个作业分配的工作线程数。由于在最坏的情况下一次可以运行10个作业,因此我可以为每个作业分配10个线程。但是,如果只有一项作业正在运行10个线程,那我将无法充分利用该服务。
我认为我可以使用PoolingHttpClientConnectionManager来池化线程并使用它们来访问服务。我可以使用DefaultMaxPerRoute
和MaxTotal
作为100。
优势:当仅运行一项作业时,我可以充分利用外部服务。
问题是当10个作业正在运行时,将竞争1000个线程来调用该服务。为每个作业创建默认的100个线程是否可以,否则资源争用会导致问题吗?
更新:
了解到我将要使用的客户端必须没有连接请求超时才能从池中检出/租赁连接,否则它将抛出ConnectionPoolTimeoutException
。
答案 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执行目标网址。
致谢。