Где пропущенный HTTP-запрос, когда CountDownLatch получает нулевой счет?
Я тестирую многопоточный код, который отправляет набор http-запросов с помощью клиента CloseableHttpAsyncClient (см. Фрагмент кода ниже).
Я получаю следующий вывод:
Failed ->java.io.IOException: Connection reset by peer-null
Failed ->org.apache.http.ConnectionClosedException: Connection closed-null
Thread: 0-Time: 2955ms-Completed: 1000-Failed: 0-Cancelled: 0- Countdown: 0
Thread: 1-Time: 2855ms-Completed: 999-Failed: 0-Cancelled: 0-Countdown: 0
Thread: 2-Time: 2741ms-Completed: 999-Failed: 1-Cancelled: 0-Countdown: 0
Thread: 3-Time: 2678ms-Completed: 999-Failed: 1-Cancelled: 0-Countdown: 0
Thread: 4-Time: 2654ms-Completed: 1000-Failed: 0-Cancelled: 0-Countdown: 0
Таким образом, два потока правильно выполнили все 1000 запросов, другие два потока имели ошибки подключения, которые были правильно перехвачены, а один поток (номер 1) выполнил 999 запросов и не получил никакого уведомления об ошибке или отмене.
Мои вопросы:
есть ли способ в методе сбоя, чтобы понять, какой запрос был неудачным, поэтому я могу выполнить постобработку для повторной отправки этих неудачных запросов?
почему, если не было сбоев, отмен или исключений, число обратного отсчета достигло 0, когда не все запросы были выполнены?
class AsynchThread extends Thread{ CloseableHttpAsyncClient httpclient; int n; int ncompleted =0; int nfailed =0; int ncancelled =0; long time; CountDownLatch latch; public AsynchThread(CloseableHttpAsyncClient httpclient, int n) throws IOReactorException { this.jobs = jobs; this.httpclient = httpclient; this.n = n; } public void process() throws InterruptedException, IOException { latch = new CountDownLatch(n); long starttime = System.currentTimeMillis(); for (int v=0;v<n; v++) { HttpPost httppost = ... httpclient.execute(httppost, new FutureCallback<HttpResponse>() { public void completed(final HttpResponse response) { latch.countDown(); ncompleted += 1; } public void failed(final Exception ex) { latch.countDown(); nfailed += 1; System.out.println("Failed ->" + ex); } public void cancelled() { latch.countDown(); ncancelled += 1; System.out.println("Cancelled ->" + ex); } }); } latch.await(); time = System.currentTimeMillis()-starttime; } public void run() { try { process(); }catch(Exception e) { System.out.println(e.getStackTrace()); } } } public static void main(final String[] args) throws Exception { CloseableHttpAsyncClient httpclient = ... int n = 5; int nprocthread = 1000; AsynchThread[] threads = new AsynchThread[n]; for (int i=0; i<n; i++) { threads[i] = acall.createThread(httpclient, nprocthread); threads[i].run(); } for(int i = 0; i < threads.length; i++) threads[i].join(); for(int i = 0; i < threads.length; i++) { System.out.println("Thread: " + i + "-Time: " + threads[i].time + "ms-Completed: " + threads[i].ncompleted + "-Failed: " + threads[i].nfailed + "-Cancelled: " + threads[i].ncancelled + "-Countdown: " + threads[i].latch.getCount()); } }
Спасибо заранее.
1 ответ
Все проблемы были решены, когда добавлен заголовок "Подключение: закрыть"