Как запустить несколько запросов на получение из одного потока в java?

Я хочу настроить клиент с 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, а затем он останавливается.


person user2953423    schedule 08.09.2019    source источник


Ответы (1)


Вам нужно закрыть ответ, используйте попытку с ресурсами. Используйте следующий код:

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);
    }
}
person i.bondarenko    schedule 08.09.2019