我有一个Spring Batch应用程序,可以在samba服务器中获取文件 并在同一服务器上的其他文件夹中生成一个新文件。 然而, 流中仅调用ItemReader。 问题是什么?谢谢。
批处理配置:
@Configuration
@EnableBatchProcessing
public class BatchConfiguration extends BaseConfiguration {
@Bean
public ValeTrocaItemReader reader() {
return new ValeTrocaItemReader();
}
@Bean
public ValeTrocaItemProcessor processor() {
return new ValeTrocaItemProcessor();
}
@Bean
public ValeTrocaItemWriter writer() {
return new ValeTrocaItemWriter();
}
@Bean
public Job importUserJob(JobCompletionNotificationListener listener) throws Exception {
return jobBuilderFactory()
.get("importUserJob")
.incrementer(new RunIdIncrementer())
.repository(getJobRepository())
.listener(listener)
.start(this.step1())
.build();
}
@Bean
public Step step1() throws Exception {
return stepBuilderFactory()
.get("step1")
.<ValeTroca, ValeTroca>chunk(10)
.reader(this.reader())
.processor(this.processor())
.writer(this.writer())
.build();
}
}
基本配置:
public class BaseConfiguration implements BatchConfigurer {
@Bean
@Override
public PlatformTransactionManager getTransactionManager() {
return new ResourcelessTransactionManager();
}
@Bean
@Override
public SimpleJobLauncher getJobLauncher() throws Exception {
final SimpleJobLauncher simpleJobLauncher = new SimpleJobLauncher();
simpleJobLauncher.setJobRepository(this.getJobRepository());
return simpleJobLauncher;
}
@Bean
@Override
public JobRepository getJobRepository() throws Exception {
return new MapJobRepositoryFactoryBean(this.getTransactionManager()).getObject();
}
@Bean
@Override
public JobExplorer getJobExplorer() {
MapJobRepositoryFactoryBean repositoryFactory = this.getMapJobRepositoryFactoryBean();
return new SimpleJobExplorer(repositoryFactory.getJobInstanceDao(), repositoryFactory.getJobExecutionDao(),
repositoryFactory.getStepExecutionDao(), repositoryFactory.getExecutionContextDao());
}
@Bean
public MapJobRepositoryFactoryBean getMapJobRepositoryFactoryBean() {
return new MapJobRepositoryFactoryBean(this.getTransactionManager());
}
@Bean
public JobBuilderFactory jobBuilderFactory() throws Exception {
return new JobBuilderFactory(this.getJobRepository());
}
@Bean
public StepBuilderFactory stepBuilderFactory() throws Exception {
return new StepBuilderFactory(this.getJobRepository(), this.getTransactionManager());
}
}
ValeTrocaItemReader:
@Configuration
public class ValeTrocaItemReader implements ItemReader<ValeTroca>{
@Value(value = "${url}")
private String url;
@Value(value = "${user}")
private String user;
@Value(value = "${password}")
private String password;
@Value(value = "${domain}")
private String domain;
@Value(value = "${inputDirectory}")
private String inputDirectory;
@Bean
@Override
public ValeTroca read() throws MalformedURLException, SmbException, IOException, Exception {
File tempOutputFile = getInputFile();
DefaultLineMapper<ValeTroca> lineMapper = new DefaultLineMapper<>();
lineMapper.setLineTokenizer(new DelimitedLineTokenizer() {
{
setDelimiter(";");
setNames(new String[]{"id_participante", "cpf", "valor"});
}
});
lineMapper.setFieldSetMapper(
new BeanWrapperFieldSetMapper<ValeTroca>() {
{
setTargetType(ValeTroca.class);
}
});
FlatFileItemReader<ValeTroca> itemReader = new FlatFileItemReader<>();
itemReader.setLinesToSkip(1);
itemReader.setResource(new FileUrlResource(tempOutputFile.getCanonicalPath()));
itemReader.setLineMapper(lineMapper);
itemReader.open(new ExecutionContext());
tempOutputFile.deleteOnExit();
return itemReader.read();
}
ItemProcessor的示例:
public class ValeTrocaItemProcessor implements ItemProcessor<ValeTroca, ValeTroca> {
@Override
public ValeTroca process(ValeTroca item) {
//Do anything
ValeTroca item2 = item;
System.out.println(item2.getCpf());
return item2;
}
编辑: -Spring boot 2.1.2.RELEASE-Spring batch 4.1.1.RELEASE
答案 0 :(得分:1)
查看您的配置,这里有几点注意事项:
BatchConfiguration
看起来不错。这是一个典型的工作,只需一个面向块的步骤。BaseConfiguration
实际上是使用@EnableBatchProcessing
而不提供数据源时获得的默认配置。因此可以删除此类@Configuration
上添加ValeTrocaItemReader
并用read()
标记方法@Bean
是不正确的。这意味着您正在应用程序上下文中声明类型为read
的名为ValeTroca
的bean。此外,您的自定义阅读器使用FlatFileItemReader
,但与FlatFileItemReader
相比,没有附加值。您可以将您的阅读器声明为FlatFileItemReader
并根据需要进行配置(资源,行映射器等)。这也将避免在read
方法中打开执行上下文的错误,该错误应在初始化读者时或在读者实现ItemStream
ItemStream#open
方法中打开。
除此之外,从您分享的内容中我看不到为什么没有调用处理器和编写器。
答案 1 :(得分:0)
已解决:问题是,即使我没有使用任何数据库,Spring Batch尽管配置为在内存中具有JobRepository,但仍需要一个数据库(通常为H2)来保存配置表格,工作等。
在这种情况下,在pom.xml中禁用了JDBC且没有H2的依赖关系。刚刚将它们添加到项目中,问题就解决了!