java - 如何在java中从一个线程运行多个get请求?
问题描述
我想设置一个具有 x 个连接的客户端,其中每个连接将在每个随机时间向不同的 URL 发送一个新的 GET 请求。
所以我的方法是创建 x 个线程,每个线程都会在循环中发送一个 GET 请求(直到程序终止)。我使用的是 Apache MultiThreadedHttpConnectionManager,我将可能的连接数设置为 x。
ClientHandler(int numberOfClients) {
this.numberOfClients = numberOfClients;
connManager = new PoolingHttpClientConnectionManager();
HttpClientBuilder clientBuilder = HttpClients.custom().setConnectionManager(connManager);
connManager.setMaxTotal(numberOfClients);
CloseableHttpClient httpClient = clientBuilder.build();
generateMultiThreadedClient(httpClient);
}
private void generateMultiThreadedClient(CloseableHttpClient httpClient) {
for (int i = 0; i < numberOfClients; i++) {
String clientUrl = URL + i;
HttpGet httpGet = new HttpGet(clientUrl);
ClientMultiThreaded clientMultiThreaded = new ClientMultiThreaded(httpClient,httpGet, i);
LOGGER.info(CLIENT_LOG + "A new thread for clientId " + i + " was created.");
clientMultiThreaded.start();
LOGGER.info(CLIENT_LOG + "Thread for clientId " + i + " started..");
}
}
这是我的线程的 run() 方法。
ClientMultiThreaded(CloseableHttpClient httpClient, HttpGet httpGet, int clientId) {
this.httpClient = httpClient;
this.clientId = clientId;
this.httpGet = httpGet;
randomGenerator = new Random();
}
@Override
public void run() {
try{
// Execute request for the first time
executeRequest(httpGet);
while (true) {
int timeToSleep = randomGenerator.nextInt(BOUND_LIMIT) + 1;
LOGGER.info(CLIENT_LOG + "Thread id " + clientId + " went to sleep for " + timeToSleep / 1000 + " seconds");
sleep(timeToSleep);
LOGGER.info(" ------- This is a test log printing for clientId: " +clientId);
executeRequest(httpGet);
}
}catch(Exception e) {
LOGGER.info(e.getMessage());
}
}
private void executeRequest(HttpGet httpGet) throws IOException {
CloseableHttpResponse response = httpClient.execute(httpGet);
LOGGER.info(CLIENT_LOG + "clientId " + clientId + " sent get request to URL " + httpGet.getURI());
statusCode = this.response.getStatusLine().getStatusCode();
LOGGER.info(CLIENT_LOG + "Status received for clientId " + clientId + " is: " + statusCode);
}
问题是我实际上收到了 2 个 GET 请求,然后它就停止了。
解决方案
您需要关闭响应,使用资源尝试使用以下代码:
private void executeRequest(HttpGet httpGet) throws IOException {
try (CloseableHttpResponse response = httpClient.execute(httpGet)) {
LOGGER.info(CLIENT_LOG + "clientId " + clientId + " sent get request to URL " + httpGet.getURI());
statusCode = this.response.getStatusLine().getStatusCode();
LOGGER.info(CLIENT_LOG + "Status received for clientId " + clientId + " is: " + statusCode);
}
}
推荐阅读
- python - 从函数返回字符串列表,而不是包含列表的单个字符串
- tr - 在 tr 命令中使用 -c 选项时没有结果
- python - 处理 tar 文件时出错(退出状态 1):写入 /usr/lib/python2.7/ensurepip/_bundled/pip-9.0.3-py2.py3-none-any.whl:设备上没有剩余空间
- python - 如何清理 PSQL LIKE 查询以防止注入攻击 - SQALCHEMY PYTHON
- jquery - 无法从 .net 中的 Ajax 调用 .asmx Web 服务
- dependency-injection - 为什么 Dagger 子组件在模块中声明,而不是直接在父组件中声明?
- python - Matplotlib - 画布不重绘
- node.js - 使用 TypeORM 连接 MySQL 数据库时如何禁用 SSL
- python - 为什么过滤较小的日期不起作用?
- google-apps-script - DocumentApp.getUi() 上下文错误的解决方法?