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