Многопоточное чтение из ConcurrentLinkedQueue и запись в БД.Не все записи пишутся - PullRequest
0 голосов
/ 26 мая 2018

У меня есть метод, который записывает в очереди около 7 миллионов записей. Я читаю записи по одной, в нескольких потоках и записываю их в БД.Вот фрагмент кода для класса, который это делает.Опять же, это выполняется в многопоточной среде.

private class WriteRunner<T> implements Callable<Long> {

// member variables

public WriteRunner(ConcurrentLinkedQueue<T> elementsQueue,...)
     //constructor
}

@Override
public Long call() throws Exception {

  while (!elementsQueue.isEmpty()) {
    int failures = 0;
    T t = elementsQueue.poll();
    while (true) {
      try {
        // write to DB
        break;
      } catch (Exception e) {
        //Log error
        //Wait for 10 seconds and retry
        Thread.sleep(10000);
        if (++failures > 10) {
          throw new Exception(
              String.format("[TID: %d] Connection repeatedly failed.", threadId));
        }
      }
    }

  }

  //log more stuff
  return (long)total;
}
}

Вот как я вызываю метод

      for (int i = 0; i < N_THREADS; i++) {
           completionService.submit(
             new WriteRunner<T>(elementsQueue ,...));
       }
       long total = 0;
       for (int i = 0; i < N_THREADS; i++) {
            total += completionService.take().get();
       }

Я пропускаю столько записей, сколько существует исключений.Моя идея состоит в том, чтобы повторить попытку с тем же элементом 't', что и в последнем опросе.

Что не так с исключениями?

...