Где пропущенный HTTP-запрос, когда CountDownLatch получает нулевой счет? - PullRequest
0 голосов
/ 29 октября 2018

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

Мои вопросы:

  1. Есть ли какой-нибудь способ в неудавшемся методе понять, какой запрос был неудачным, поэтому я могу выполнить постобработку для повторной отправки этих неудавшихся запросов?

  2. почему, если не было сбоев, отмен или исключений, число обратного отсчета достигло 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 Ответ

0 голосов
/ 30 октября 2018

Все проблемы были решены при добавлении шапки "Соединение: закрыть"

...