0

我正在使用带有读取器、写入器和处理器的 spring 批处理应用程序。文件名从批处理作业传递到 stepscope 中的写入器。初始化 bean 时,我可以在 BATCH_STEP_EXECUTION 表中看到异常,如下所示 org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'scopedTarget.resWriter' defined in class path resource : Bean instantiation via factory method failed; nested exception is org.springframework.beans.BeanInstantiationException: Failed to instantiate [org.springframework.batch.item.file.FlatFileItemWriter]: Factory method 'resWriter' threw exception; nested exception is java.lang.IllegalArgumentException: Path must not be null

春季批处理代码

    @StepScope
    @Bean
    public FlatFileItemWriter<EntityObject> regulatedEntityWriter(@Value("#{jobParameters['fileName']}") String fileName){
        
        /*
           while bean is initialized fileName is empty and FlatFileItemWriter requries filename, then it throws  Path must not be null exeption
        */
        pretaFileName = fileName;
        FlatFileItemWriter<EntityObject> csvFileWriter = new FlatFileItemWriter<>();
        
            String exportFileHeader = "column1,column2,column3";
            StringHeaderWriter headerWriter = new StringHeaderWriter(exportFileHeader);
            csvFileWriter.setHeaderCallback(headerWriter);
            csvFileWriter.setShouldDeleteIfEmpty(true);
            
            CustomDelimitedLineAggregator<EntityObject> lineAggregator = new CustomDelimitedLineAggregator<>();
            BeanWrapperFieldExtractor<EntityObject> fieldExtractor = new BeanWrapperFieldExtractor<>();
            fieldExtractor.setNames(new String[]{"column1", "column2", "column3"});
            lineAggregator.setFieldExtractor(fieldExtractor);
            csvFileWriter.setLineAggregator(lineAggregator);
            csvFileWriter.setEncoding(encodingType);
            csvFileWriter.setResource(new FileSystemResource(fileName));
        return csvFileWriter;
    }
    ```

 Above method is called using joblauncher

```  JobParameters params = new JobParametersBuilder()
                    .addString("JobID", String.valueOf(System.currentTimeMillis()))
                    .addString("fileName", "sample_file.txt")
                    .toJobParameters();
          
            JobExecution jobExecution =jobLauncher.run(job, params);

我已经尝试过@Lazy 注释,但当服务器启动时它仍然会抛出该异常。我正在使用多节点集群,它在服务器出现在 BATCH_STEP_EXECUTION 表中时为每个节点添加条目。如何在服务器首次启动时避免此异常?

4

1 回答 1

0

我在 springboot application.properties 中使用了以下属性来默认禁用 spring 批处理,因为我正在通过 cron 触发器触发和传递参数。

spring.batch.job.enabled=false

于 2020-07-18T18:07:01.910 回答