Olá pessoal, estou com um problema ao utilizar processamento paralelo com parallel stream.
Ao final dos cálculos, quando chega a parte de inserir os dados no BD, alguns inserts dão erro de chave primaria duplicada, mas quando executo somente com uma thread esse erro não ocorre.
Segue um exemplo do código.
public class Processamento implements Serializable {
private static final long serialVersionUID = 1L;
private final Integer parallelism = 6;
private ForkJoinPool forkJoinPool = null;
public void inicio(LocalDate data) throws InterruptedException {
List<Arquivo> lista = new ArrayList<Arquivo>(consultaArquivo(Integer id));
try {
if (!lista.isEmpty()) {
forkJoinPool = new ForkJoinPool(parallelism);
forkJoinPool.submit(() ->
lista.parallelStream().forEach(i -> processa(i))).get();
}
} catch (InterruptedException | ExecutionException e) {
log.error(e.getMessage());
} finally {
if (forkJoinPool != null) {
forkJoinPool.shutdown();
}
}
}
public void processa (Arquivo arquivo){
// calculos ...
ArquivoDao dao = new ArquivoDao.incluir(arquivo)
}
}