首页 > 解决方案 > Spring Boot Batch 写入空文件

问题描述

我不确定为什么这个应用程序没有向文件写入任何内容。我正在读取 MySQL 数据库并写入 CSV 文件。我可以在 ItemProcessor 日志中看到所需的结果集,但它没有在文件中写入任何内容。我的文件位于资源/userinfo.csv 此处。没有错误或异常。花了很多时间来修复它。非常感谢您的帮助。这是我的代码

@Configuration
@EnableBatchProcessing
public class BatchConfiguration {
    @Autowired
    public JobBuilderFactory jobBuilderFactory;
 
    @Autowired
    public StepBuilderFactory stepBuilderFactory;
 
    @Autowired
    public DataSource dataSource;
 
    @Bean
    public JdbcCursorItemReader<UserInfo> reader(){
      JdbcCursorItemReader<UserInfo> reader = new 
      JdbcCursorItemReader<UserInfo>();
      reader.setDataSource(dataSource);
      reader.setSql("SELECT first_name,last_name FROM db2.userinfo");
      reader.setRowMapper(new UserRowMapper());
  
      return reader;
    }
 
    @Bean
    public UserInfoItemProcessor processor(){
      return new UserInfoItemProcessor();
    }
 
    @Bean
    public FlatFileItemWriter<UserInfo> writer(){
     
     return new FlatFileItemWriterBuilder<UserInfo>()
                .name("writer")
                .resource(new ClassPathResource("userinfo.csv"))
                .delimited()
                .delimiter(",")
                .names(new String[] {
                        "first_name",
                        "last_name"})
                .shouldDeleteIfExists(true)
                .build(); 
    }
 
    @Bean
    public Step step1() {
     return stepBuilderFactory.get("step1").<UserInfo, UserInfo> chunk(10)
       .reader(reader())
       .processor(processor())
       .writer(writer())
       .build();
    }
 
    @Bean
    public Job exportUserJob() {
     return jobBuilderFactory.get("exportUserJob")
       .incrementer(new RunIdIncrementer())
       .flow(step1())
       .end()
       .build();
    }

}

UserRawMapper 类

  public class UserRowMapper implements RowMapper<UserInfo> {

    @Override
    public UserInfo mapRow(ResultSet rs, int rowNum) throws SQLException {
      UserInfo userInfo = new UserInfo();
      userInfo.setFirst_name(rs.getString("first_name"));
      userInfo.setLast_name(rs.getString("last_name"));
    
      System.out.println(">>> USERINFO -> " + userInfo.getFirst_name());
      // it prints fine here.....
      return userInfo;
    }

 }

用户信息类

  public class UserInfo {
    private String first_name;
    private String last_name;

    public String getFirst_name() {
      return first_name;
    }
    public void setFirst_name(String first_name) {
      this.first_name = first_name;
    }
    public String getLast_name() {
      return last_name;
    }
    public void setLast_name(String last_name) {
      this.last_name = last_name;
    }
  }

UserInfoItemProcessor.class

public class UserInfoItemProcessor implements ItemProcessor<UserInfo, UserInfo>{

   @Override
   public UserInfo process(UserInfo userInfo) throws Exception {
       return userInfo;
   }

}

应用程序属性

spring.datasource.url=jdbc:mysql://localhost:3306/db2?useSSL=false
spring.datasource.username=username
spring.datasource.password=password
spring.datasource.schema=classpath:/org/springframework/batch/core/schema-mysql.sql
spring.batch.initialize-schema=always
spring.datasource.initialize=true

标签: javaspringspring-bootspring-batch

解决方案


推荐阅读