Я хочу настроить клиент с x соединениями, где каждое соединение будет каждый случайный раз отправлять новый запрос GET на другой URL-адрес.
Итак, мой подход заключается в создании 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, а затем он останавливается.