【问题标题】:spring batch execution, how to avoid if file name is empty with FlatFileItemWriter from logging exception春季批处理执行,如何避免使用FlatFileItemWriter记录异常的文件名为空
【发布时间】:2020-11-07 18:38:00
【问题描述】:

我正在使用带有读取器、写入器和处理器的 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

Spring 批处理代码

    @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 表中时,它会为每个节点添加条目。如何在服务器首次启动时避免此异常?

【问题讨论】:

  • 获取文件名后如何重启作业?如果它是由 cron 启动的,你可以跳过空文件名运行
  • Cron 表达式用于运行作业,并且配置为每天运行一次,但是 writer bean 在服务器启动时初始化并抛出 java.lang.IllegalArgumentException: Path must not be null.Is there以任何方式跳过此异常日志记录到 BATCH_STEP_EXECUTION 并且每次服务器启动时都会发生这种情况。
  • 我认为您的项目编写者的定义以及您如何传递 fileName 作业参数没有任何问题。 Factory method 'resWriter' threw exception 中的 resWriter 方法是什么?这个方法在哪里定义?你能分享它的代码吗?

标签: spring spring-boot spring-batch spring-batch-job-monitoring


【解决方案1】:

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

spring.batch.job.enabled=false

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-02-12
    • 1970-01-01
    • 2014-12-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-06-11
    • 1970-01-01
    相关资源
    最近更新 更多