在 Spring Batch 中访问巨大的多部分文件

问题描述 投票:0回答:0

我正在尝试在 Spring 图像批处理系统中发送巨大的多部分文件。 我将 Multipartfile[] 发送到 Controller,然后发送到 Service。在服务中,我只是将文件设置在静态多部分文件数组中。然后启动作业启动器。 在 Reader 中,我只是访问静态数组并读取数据。

但我的问题是我不想那样使用静态变量,因为我必须以 GB 为单位发送大量数据。那么我如何从我的服务中调用读取方法,以便我可以在参数中发送数据。

这是我的服务:

@Service
public class ImageService {
    @Autowired
    private JobLauncher jobLauncher;
    @Autowired
    private Job job;
    public static MultipartFile[] files = null;

    public void imageFiles(MultipartFile[] files) {
        JobParameters jobParameters = new JobParametersBuilder()
                .addLong("startAt", System.currentTimeMillis()).toJobParameters();
        try {
            ImageService.files = files;
            jobLauncher.run(job, jobParameters);
        } catch (JobExecutionAlreadyRunningException | JobRestartException | JobInstanceAlreadyCompleteException |
                 JobParametersInvalidException e) {
            e.printStackTrace();
        }
    }
}

这是我的读者类:

@Service
public class MyCustomReader implements ItemReader<MultipartFile> {
    private int index = 0;

    @Override
    public MultipartFile read() throws Exception {
        MultipartFile[] files = ImageService.files;
        if (index >= files.length)
            return null;
        return files[index++];
    }
}

这是我的配置类:

@Configuration
@EnableBatchProcessing
@AllArgsConstructor
public class BatchConfig {
    @Autowired
    private JobBuilderFactory jobBuilderFactory;
    @Autowired
    private StepBuilderFactory stepBuilderFactory;
    @Autowired
    private MyCustomReader myCustomReader;
    @Autowired
    private MyCustomProcessor myCustomProcessor;
    @Autowired
    private MyCustomWriter myCustomWriter;

    @Bean
    public Step step() {
        return stepBuilderFactory.get("MyStep").<MultipartFile, MultipartFile>chunk(3)
                .reader(myCustomReader)
                .processor(myCustomProcessor)
                .writer(myCustomWriter)
                .build();
    }

    @Bean
    public Job runBatchJob() {
        return jobBuilderFactory.get("batch")
                .flow(step()).end().build();
    }

}

试了很多方法都解决不了

spring spring-boot spring-mvc spring-batch batch-processing
© www.soinside.com 2019 - 2024. All rights reserved.