【问题标题】:accessing resources in next steps spring batch在后续步骤 Spring Batch 中访问资源
【发布时间】:2018-02-13 17:48:03
【问题描述】:

您好,我的 spring 批处理应用程序中有以下 Tasklet:

public class FileMovingTasklet implements Tasklet, InitializingBean {


    @Value("${positionFile.source-path}")
    private String sourcePath;

    @Value("${positionFile.local-path}")
    private String localDirectory;

    @Value("${positionFile.patternName}")
    private String fileNamePattern;

    @Value("${positionFile.suffix}")
    private String suffix;

    @Override
    public RepeatStatus execute(StepContribution contribution, ChunkContext chunkContext) throws Exception {

        //***code***

            List<PathResource> resources = FileManager.getInputFileList(sourcePath, fileNamePattern, suffix, fileDate);

            if (!CollectionUtils.isEmpty(resources)) {
                copyFiles(resources, localDirectory);
                log.info("Copied files to local directory...");

            }

        } catch (IOException e) {
            log.error("Position File not found with sourcePatch={}, fileName={}, suffix={}, filedate={}", sourcePath, fileNamePattern, suffix, fileDate);
            throw new TaskletException("Could not move file from source to local " + e);
        }

        return RepeatStatus.FINISHED;
    }

    private void copyFiles(List<PathResource> resources, String localDirectory) {

        for (Resource resource : resources) {

            File source;
            File target;

            try {
                source = resource.getFile();
                target = new File(localDirectory + File.separator + source.getName());

                try {
                    FileCopyUtils.copy(source, target);
                } catch (IOException e) {

                }
            } catch (IOException e) {
            }
        }

    }

}

我正在将一些文件从源移动到本地目的地。本地目的地是我要读取文件并在后续步骤中处理和写入的位置。

我的Job配置如下:

@Configuration
public class BatchConfiguration {

    @Autowired
    private JobBuilderFactory jobBuilderFactory;

    @Autowired
    private StepBuilderFactory stepBuilderFactory;

    @Autowired
    private FileMovingTasklet fileMovingTasklet;

    @Value("${positionFile.local-path}")
    private Resource[] resources;

    @Autowired
    private PriceDao scpDao;

    @Autowired
    public PositionRowReader positionRowReader;


    @Bean
    public MultiResourceItemReader<Pos> multiResourceItemReader() {
        MultiResourceItemReader<Pos> resourceItemReader = new MultiResourceItemReader<>();
        resourceItemReader.setResources(resources);
        resourceItemReader.setDelegate(posRowReader());
        return resourceItemReader;
    }

    @Bean
    public FlatFileItemReader<Pos> posRowReader() {
        return positionRowReader.getReader();
    }


    @Bean
    public ItemProcessor<Pos, Price> posRowProcessor() {
        return new PosRowItemProcessor();
    }


    @Bean
    public JobExecutionListener listener() {
        return new JobCompletionNotificationListener(scpDao);
    }


    @Bean
    public Job import() {
        return jobBuilderFactory.get("import")
                .incrementer(new RunIdIncrementer())
                .listener(listener())
                .start(getPositionFileStep())
                .next(step1())
                .build();
    }


    @Bean
    public Step getPositionFileStep() {
        return stepBuilderFactory.get("getPositionFileStep")
                .tasklet(fileMovingTasklet)
                .build();
    }

    @Bean
    public Step step1() {
        return stepBuilderFactory.get("step1")
                .<Pos, Price>chunk(50)
                .reader(multiResourceItemReader())
                .processor(posRowProcessor())
                .writer(new PriceWriter(scpDao))
                .build();
    }



}

执行step1时读取器初始化失败:

org.springframework.batch.item.ItemStreamException: Failed to initialize the reader

我的本​​地路径属性如下:

positionFile.local-path=C:\\Dev\\workspace\\batch\\src\\main\\resources\\localPath

positionFile.patterName=PositionFile*

我的问题是,从源文件夹复制文件后,如何在 step1 中访问可以是多个文件的资源(文件)。

即使有文件,我的资源大小也是 0:

   @Value("${positionFile.local-path}")
    private String filePath;

    @Value("${positionFile.patternName}")
    private String filePattern;


    @Bean
    @StepScope
    public MultiResourceItemReader<PosRow> multiResourceItemReader() {
        MultiResourceItemReader<PosRow> resourceItemReader = new MultiResourceItemReader<>();
        Resource[] resources = new Resource[0];
        try {
            ClassLoader cl = this.getClass().getClassLoader();
            ResourcePatternResolver resolver = new PathMatchingResourcePatternResolver(cl);
            resources = resolver.getResources("file:" + filePath + File.separator + filePattern + "*");
        } catch (IOException e) {
            log.error("Problem with getting resource files");
        }
        resourceItemReader.setResources(resources);
        resourceItemReader.setDelegate(posRowReader());
        return resourceItemReader;
    }

【问题讨论】:

    标签: java spring spring-boot spring-batch


    【解决方案1】:

    您需要使用 @StepScope

    让您的 MultiResourceItemReaderFlatFileItemReader 变得懒惰
        @Bean
        @StepScope
        public MultiResourceItemReader<Pos> multiResourceItemReader() {
                MultiResourceItemReader<Pos> resourceItemReader = new MultiResourceItemReader<>();
                resourceItemReader.setResources(resources);
                resourceItemReader.setDelegate(posRowReader());
                return resourceItemReader;
            }
    
            @Bean
            @StepScope
            public FlatFileItemReader<Pos> posRowReader() {
                return positionRowReader.getReader();
            }
    

    【讨论】:

    • 你能解释一下你的答案吗?这将如何帮助初始化阅读器并查看路径中的多个文件?我认为我没有正确设置资源
    • '@StepScope' 会让你的读者变得懒惰。 MultiResourceItemReader bean 将在 firstStep 中复制文件后加载(如您所述)。如果你不使用 '@StepScope' 那么 - bean 将在 SpringContex 加载时被加载。那个时候它不会在那个位置找到文件
    • 正确,我明白了,谢谢。但是我没有使用“文件:”来设置自动连接到Resources 的路径属性。这里需要吗?
    • 如果您使用的是 PathMatchingResourcePatternResolver 那么您需要使用文件:如果提供的解决方案对您有帮助,请接受答案:)
    • 您能否更新您的答案以显示我在尝试使用PathMatchingResourcePatternResolver 获取资源时做错了什么。我更新了问题。那么我会接受:)。当路径匹配模式中有 2 个文件时,我的资源大小为 0
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-12-11
    • 2015-05-21
    • 1970-01-01
    • 2018-09-27
    • 2017-08-30
    • 2023-02-10
    相关资源
    最近更新 更多