Spring Bactch写入空文件

时间:2020-06-28 06:22:47

标签: spring spring-batch

我是批处理编程的新手,并且正在使用Spring Batch。尝试使用一些在线示例,但是修复了很多错误之后,我得到了一个空文件。我试图从一个简单的MySql数据库中读取并写入CSV文件。 users.csv位于资源文件夹中。花了很多时间看我在做什么错。没有错误消息,但始终显示空文件。如果有人可以帮助我解决此问题,我将不胜感激。这是我的代码;

BatchConfig.class

@Configuration
@EnableBatchProcessing
public class BatchConfig {

    @Autowired
    private JobBuilderFactory jobBuilderFactory;
    
    @Autowired
    private StepBuilderFactory stepBuilderFactory;
    
    @Autowired
    private DataSource dataSource;
    
    @Bean
    public JdbcCursorItemReader<User> reader(){
        JdbcCursorItemReader<User> cursorItemReader = new JdbcCursorItemReader<>();
        cursorItemReader.setDataSource(dataSource);
        cursorItemReader.setSql("SELECT user_id,first_name,last_name,email FROM demodb.user");
        cursorItemReader.setRowMapper(new UserRowMapper());
        return cursorItemReader;
    }
    
    @Bean
    public UserItemProcessor processor(){
        return new UserItemProcessor();
    }
    
    @Bean
    public FlatFileItemWriter<User> writer(){
        FlatFileItemWriter<User> writer = new FlatFileItemWriter<User>();
        writer.setResource(new ClassPathResource("users.csv"));
        
        DelimitedLineAggregator<User> lineAggregator = new DelimitedLineAggregator<User>();
        lineAggregator.setDelimiter(",");
        
        BeanWrapperFieldExtractor<User>  fieldExtractor = new BeanWrapperFieldExtractor<User>();
        fieldExtractor.setNames(new String[]{"userId","firstName","lastName", "email"});
        lineAggregator.setFieldExtractor(fieldExtractor);
        
        writer.setLineAggregator(lineAggregator);
        return writer;
    }
    
     
    @Bean
    public Step step1(){
        return stepBuilderFactory
                .get("step1")
                .<User,User>chunk(100)
                .reader(reader())
                .processor(processor())
                .writer(writer())
                .build();
    }

    @Bean
    public Job exportUserJob(){
        return jobBuilderFactory
                .get("exportUserJob")
                .incrementer(new RunIdIncrementer())
                .flow(step1())
                .end()
                .build();
    }
}

UserRowMapper.class

    public class UserRowMapper implements RowMapper<User> {

      @Override
      public User mapRow(ResultSet rs, int rowNum) throws SQLException {
           User user = new User();
           user.setUserId(rs.getInt("user_id"));
           user.setFirstName(rs.getString("first_name"));
           user.setLastName(rs.getString("last_name"));
           user.setEmail(rs.getString("email"));
          return user;
      }

   }

User.class

    public class User {
      private int userId;
      private String firstName;
      private String lastName;
      private String email;
    
      public int getUserId() {
          return userId;
      }
      public void setUserId(int userId) {
          this.userId = userId;
      }
    
      public String getFirstName() {
          return firstName;
      }
      public void setFirstName(String firstName) {
          this.firstName = firstName;
      }
      public String getLastName() {
          return lastName;
      }
      public void setLastName(String lastName) {
          this.lastName = lastName;
      }
      public String getEmail() {
          return email;
      }
      public void setEmail(String email) {
          this.email = email;
      }
    
   }

UserItemProcessor.class

    public class UserItemProcessor implements ItemProcessor<User, User>{

       @Override
       public User process(User person) throws Exception {
          return person;
       }

    }

application.properties

spring.datasource.url=jdbc:mysql://localhost:3306/demodb
spring.datasource.password=root
spring.datasource.username=root
spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver
spring.batch.initialize-schema=ALWAYS

MySql数据库

enter image description here

更新

我可以使用新文件new FileSystemResource()解决此问题。但是我正在复制一个业务用例问题。正如我提到的,我是Spring批处理的新手,我需要从仅具有查看权限的生产数据库中进行读取。我知道Spring批处理使用元数据表来处理批处理。那么是否需要对该表具有写权限?如果真是这样,那么在生产环境中,只有获得查看权限,我才能使用Spring Batch。有什么办法可以解决这个问题?覆盖任何配置?

3 个答案:

答案 0 :(得分:0)

我已通过运行此程序验证了这一点,目前可以正常运行,没有问题

问题:

正如我在下面的评论中提到的那样,用户正在错误的位置查看文件。

  • 用户在src/main/resources/users.csv上创建文件
  • 用户运行程序
  • 文件被复制到target/classes/users.csv
  • 程序正在写入target/classes/users.csv下的文件
  • 但是用户正在src/main/resources/users.csv上查看文件

答案 1 :(得分:0)

尝试减少大块价值

块:表示这是一个基于物料的步骤,是提交事务之前要处理的物料数。

答案 2 :(得分:0)

在作者的配置中使用FileSystemResource代替ClassPathResource

writer.setResource(new FileSystemResource("users.csv"));