У меня есть метод, который записывает в очереди около 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', что и в последнем опросе.
Что не так с исключениями?