【发布时间】:2014-12-05 22:08:08
【问题描述】:
我正在构建一个独立的 java 应用程序来在系统上生成负载,模拟现实世界的条件。
应用程序是多线程的,使用并发框架生成大量线程池,每个线程都运行“会话”。当会话完成时,runnable 结束并且线程返回到调度程序池。每个“会话”包含以下内容:
- 生成 HTTP PUT #1 到服务器
- 等待 x 秒(在逻辑限制内随机)
- 生成 HTTP PUT #2 到服务器
- 生成 HTTP PUT #3 到服务器
- 等待 y 秒(在逻辑限制内随机)
- 生成 HTTP PUT #4 到服务器
- 生成 HTTP PUT #5 到服务器
每个会话总共占用大约 2 分钟
并发池创建的每个线程都维护一个连接(一个 HTTPClient),该连接被后续会话重用。每次请求后,都会按照建议调用 HttpRequest.releaseConnection()。
一切都很好。但也许太好了。
虽然保持连接打开并释放它们可以提供最佳性能,因为我正在构建一个模拟器,所以我真的不想要最佳性能。我想模拟次优性能。我希望服务器必须在每个会话上建立连接。
我想在每个会话开始时创建连接(嵌入在 HTTP 客户端中)并在会话结束时关闭它。
为此,我只需在会话结束时关闭 HttpClient 并将其变量设置为 null(都在 finally 子句中)。当应用程序会话线程开始一个新会话时,如果客户端为空,它会使用 HttpClientBuilder 构建一个新会话。但是,当我这样做时,会出现各种连接池错误,这些错误会破坏模拟。
如上所述,是否有一种正确的方法可以使用 Apache HttpClient 以次优方式建立连接?有点疯狂的问题,但却是一个真实的问题。
【问题讨论】:
标签: java multithreading apache-httpclient-4.x java.util.concurrent