当前位置: 首页 > 知识库问答 >
问题:

spring批处理执行,如何避免文件名为空的FlatFileItemWriter日志异常

冯流觞
2023-03-14

我正在使用spring批处理应用程序与读取器、写入器和处理器。文件名从batchjob传递到StepScope中的writer。当bean初始化时,我可以在BATCH_STEP_EXECUTION表中看到异常,如下org.springframework.beans.factory.BeanCreationException:创建类路径资源中定义的名为'scopedtarget.reswriter'的bean时出错:通过工厂方法实例化bean失败;嵌套异常为org.springframework.beans.beanInstantiationException:无法实例化[org.springframework.batch.item.file.FlatFileItemWriter]:工厂方法“res writer”引发异常;嵌套异常为java.lang.IllegalArgumentException:路径必须不为空

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

共有1个答案

嵇星海
2023-03-14

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

spring.batch.job.enabled=false

 类似资料:
  • 我正在使用logback.xml实现SLF4J日志记录,但应用程序正在创建多个日志文件。我需要为一个日期创建一个单一的日志文件,所有的日志级别都在相同的日志文件中。 下面是我的logback.xml配置。

  • 问题内容: 我想从Java程序执行批处理文件。 我正在使用以下命令。 但是问题是我想提供一个相对路径而不是绝对路径,以便我可以在任何组件上部署该Java项目。 项目的目录结构如下: 我想从“解析器”目录中的“ Main.java”文件中运行“ util”目录中的“ Server.bat”文件。 问题答案: 当Java运行时,您可以将Runtime.exec()与相对路径一起使用,相对方式是相对于当

  • 我们有一个用Spring Boot编写的REST API。这个应用程序的一部分是每天运行的Spring批处理作业。我希望Spring批处理作业完成后,一个退出代码返回到启动应用程序的shell脚本,因此我在main方法中添加了。我才意识到这会导致整个Spring Boot应用程序退出,而这是我们不想要的。我正在寻找一种方法来执行Spring批处理作业,向调用它的shell脚本返回退出代码,并使Sp

  • 我想创建从任务计划程序运行的批处理文件 要求: 少于30天的文件应从主文件夹移动到存档文件夹 然后应删除移动的存档文件 它应该存储所有日志条目 我已经编写了步骤脚本 步骤脚本 有人能告诉我如何使用上述两个命令创建日志文件吗。 日志文件应存储其移动的所有文件名

  • 我无法在使用JPA的Spring启动应用程序中记录Spring批处理日志。这是属性文件配置(application.properties)。我想看看应用程序是否从日志中创建了Spring批处理表。 https://github.com/spring-projects/spring-batch/blob/master/spring-batch-core/src/main/resources/org/

  • 我已经将spring batch admin与现有的spring web应用程序集成。我可以使用batch admin屏幕触发/控制作业,并使用Tomcat8进行部署。一切正常,但Spring管理批处理日志在控制台中触发,导致catalina。填写GB。日志样本如下: 我的log4j配置如下: 但我不断地得到日志。你能建议如何禁用/增加日志级别吗?提前谢谢。