【问题标题】:Read data from DB in Tasklet oriented Batch process在面向 Tasklet 的批处理中从数据库中读取数据
【发布时间】:2018-11-06 16:26:36
【问题描述】:

我有一个简单的问题。我必须编写一个面向 Tasklet 的 Spring Batch 项目,该项目必须从数据库中检索一些数据,处理信息。并将其写入 .json 文件。我正在使用 Spring Data JPA,但这是正确和最安全的方法吗? 如果没有,最好的编码方式是什么? 非常感谢您的帮助!

最新的Tasklet阅读器代码:

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

}

【问题讨论】:

    标签: spring spring-data-jpa spring-batch


    【解决方案1】:

    使用Tasklet 读取、处理和写入整个数据集并不是最好的方法,因为整个数据集只有一个事务。 chunk-oriented step 更适合您的用例。使用面向块的处理,每个块将有一个事务。

    希望这会有所帮助。

    【讨论】:

    • 我知道,但是客户公司给了我一个自定义的 maven 原型,它生成一个面向 tasket 的项目,所以我必须这样工作
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-10-29
    • 1970-01-01
    • 1970-01-01
    • 2015-01-17
    • 1970-01-01
    • 2019-01-16
    • 1970-01-01
    相关资源
    最近更新 更多