Чтение данных из БД в Tasklet-ориентированном пакетном процессе - PullRequest
0 голосов
/ 06 ноября 2018

У меня простой вопрос. Я должен кодировать ориентированный на Tasklet Spring Batch проект, который должен извлекать некоторые данные из БД, обрабатывать информацию. и запишите его в файл .json. Я использую Spring Data JPA, но это правильный и самый безопасный способ сделать это? Если нет, то как лучше всего это закодировать? Большое спасибо за помощь!

Последний код программы чтения тасклетов:

public class DataReader implements Tasklet, StepExecutionListener {

@Autowired
EntityRepository entityRepository;

@Autowired
ProductRepository productRepository;

@Autowired
SuscriptionRepository suscriptionRepository;

@Autowired
MapperUtils mapperUtils;

private List<EntityDTO> entityDataDTO;

@Override
public RepeatStatus execute(StepContribution contribution, ChunkContext chunkContext) throws Exception {        
    this.entityDataDTO = new ArrayList<EntityDTO>();
    List<Entidad> entities = entityRepository.findAll();

    for (Entidad entity : entities) {
        List<SuscriptionDTO> suscriptionsDTO = new ArrayList<SuscriptionDTO>();

        for (Suscripcion suscription : entity.getSuscripciones()) {
            List<Suscripcion> suscriptionsByProduct = suscriptionRepository.findSuscriptionsByEntityIdAndSuscriptionId(suscription.getId().getIdEntidadEurbt(), suscription.getId().getIdSuscripcion());
            List<String> suscriptionProducts = new ArrayList<String>();

            for (Suscripcion suscriptionProduct : suscriptionsByProduct) {
                Producto product = productRepository.findById(suscriptionProduct.getId().getIdProductoEurbt()).get();
                suscriptionProducts.add(product.getTlDescProducto());
            }

            SuscriptionDTO suscriptionDTO = mapperUtils.mapSuscriptionDataToSuscriptionDTO(suscription, suscriptionProducts);

            if (!suscriptionsDTO.contains(suscriptionDTO)) 
                suscriptionsDTO.add(suscriptionDTO);

        }

        this.entityDataDTO.add(mapperUtils.mapEntityDataToEntityDTO(entity, suscriptionsDTO));
    }

    return RepeatStatus.FINISHED;
}

@Override
public void beforeStep(StepExecution stepExecution) {

}

@Override
public ExitStatus afterStep(StepExecution stepExecution) {
    stepExecution.getJobExecution().getExecutionContext().put("entityDataDTO", this.entityDataDTO); 
    return ExitStatus.COMPLETED;
}

}

1 Ответ

0 голосов
/ 06 ноября 2018

Использование Tasklet для чтения, обработки и записи всего набора данных - не лучший способ, поскольку для всего набора данных будет только одна транзакция. Шаг , ориентированный на чанк, больше подходит для вашего случая использования. При обработке, ориентированной на чанк, для каждого чанка будет выполняться одна транзакция.

Надеюсь, это поможет.

...