Boa noite!
Eu conseguiria definir um chunk por tamanho do arquivo? Por ex, quero processar meu arquivo inteiro, se der erro, quero que dê rollback em tudo.
Mas meu arquivo pode ter um tamanho variável.
Como seria o código?
Obrigado!
Boa noite!
Eu conseguiria definir um chunk por tamanho do arquivo? Por ex, quero processar meu arquivo inteiro, se der erro, quero que dê rollback em tudo.
Mas meu arquivo pode ter um tamanho variável.
Como seria o código?
Obrigado!
Bom dia!
No Spring Batch, o parâmetro do chunk()
precisa ser um número fixo (int), porque ele define o tamanho da transação em lote. Não existe suporte nativo para passar um valor variável, como “tamanho do arquivo” diretamente.
Se você quer que todo o arquivo seja processado dentro de uma única transação (ou seja, rollback geral em caso de erro), a estratégia é simples:
Exemplo de como ficaria:
@Configuration
public class ImportacaoJobConfiguration {
@Autowired
private PlatformTransactionManager transactionManager;
@Bean
public Step passoInicial(ItemReader<Importacao> reader,
ItemWriter<Importacao> writer,
JobRepository jobRepository) {
int totalRegistros = calcularTotalRegistrosDoArquivo("meu-arquivo.csv");
return new StepBuilder("passo-inicial", jobRepository)
.<Importacao, Importacao>chunk(totalRegistros, transactionManager) // tamanho do arquivo
.reader(reader)
.writer(writer)
.build();
}
private int calcularTotalRegistrosDoArquivo(String caminhoArquivo) {
try (Stream<String> linhas = Files.lines(Paths.get(caminhoArquivo))) {
return (int) linhas.count();
} catch (IOException e) {
throw new IllegalStateException("Erro ao ler arquivo para calcular total de registros", e);
}
}
}
o chunk será exatamente do tamanho do arquivo, ou seja, o commit só acontece no final. Se houver erro, o rollback será global.
Alternativas :
chunk()
.