多个线程从ConcurrentLinkedQueue读取,并进入DB。并非所有条目都被写入

时间:2018-05-26 07:13:23

标签: java multithreading queue try-catch

我有一个方法,可以向队列写入大约700万个条目。我在多个线程中逐个读取条目,并将其写入数据库。以下是执行此操作的类的代码段。 同样,这是在多线程环境中执行的。

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();
       }

我错过了很多条目,因为有多少例外。 我的想法是,重试同样的&#39; t&#39;是最新民意调查的元素。

例外有什么问题?

0 个答案:

没有答案