在无限循环中运行的 Spring Batch 作业 [英] Spring Batch Job Running in Infinite loop
问题描述
我正在处理简单的 Spring Batch 作业.当我启动工作时,它会在无限循环中运行.它不会停止.根据我的调度程序时间,它应该每 10 秒运行一次.但是当工作开始时,它不会停止.它只是分别从读取器、处理器和写入器打印系统输出.我正在与读者、处理器和作家一起创造工作.我正在通过注释进行所有配置.不是通过 xml.
I am working on simple Spring Batch Job. When I launch job its running in infinite loop. It doesn't stop. According to my scheduler time it should run after every 10 seconds. But when job starts it doesn't stop. Its just keeps printing sysouts from reader, processor and writer respectively. I am creating job with reader, processor and writer. And I am doing all configuration by annotations. Not by xml.
这里是批量配置
@Configuration
@EnableBatchProcessing
@EnableScheduling
public class BatchJobConfig {
@Autowired
private JobBuilderFactory jobBuilderFactory;
@Autowired
private StepBuilderFactory stepBuilderFactory;
@Autowired
private SimpleJobLauncher jobLauncher;
@Scheduled(cron="*/10 * * * * *")
public void perform() throws Exception
{
Job job = job(step1());
JobParameters jobParameters = new JobParameters();
jobLauncher.run(job, jobParameters);
}
@Bean
public Step step1()
{
return stepBuilderFactory.get("step1").<Person, Person> chunk(1)
.reader(reader()).processor(processor()).writer(writer())
.build();
}
@Bean
public Job job(Step step1) throws Exception
{
return jobBuilderFactory.get("job")
.incrementer(new RunIdIncrementer()).flow(step1())
.end().build();
}
@Bean
public DataSource dataSource()
{
EmbeddedDatabaseBuilder embeddedDatabaseBuilder = new EmbeddedDatabaseBuilder();
return embeddedDatabaseBuilder.addScript("classpath:org/springframework/batch/core/schema-drop-hsqldb.sql")
.addScript("classpath:org/springframework/batch/core/schema-hsqldb.sql")
.setType(EmbeddedDatabaseType.HSQL)
.build();
}
@Bean
public PersonReader reader() {
return new PersonReader();
}
@Bean
public PersonWriter writer() {
return new PersonWriter();
}
@Bean
public PersonProcessor processor() {
return new PersonProcessor();
}
@Bean
public MapJobRepositoryFactoryBean mapJobRepositoryFactory(ResourcelessTransactionManager txManager) throws Exception {
MapJobRepositoryFactoryBean factory = new MapJobRepositoryFactoryBean(txManager);
factory.afterPropertiesSet();
return factory;
}
@Bean
public JobRepository jobRepository(MapJobRepositoryFactoryBean factory) throws Exception {
return factory.getObject();
}
@Bean
public SimpleJobLauncher jobLauncher(JobRepository jobRepository) {
SimpleJobLauncher launcher = new SimpleJobLauncher();
launcher.setJobRepository(jobRepository);
return launcher;
}
@Bean
public ResourcelessTransactionManager transactionManager() {
return new ResourcelessTransactionManager();
}
}
PersonReader.java
PersonReader.java
public class PersonReader implements ItemReader<Person> {
@Override
public Person read() throws Exception, UnexpectedInputException, ParseException, NonTransientResourceException {
Person person = new Person();
System.out.println("In PersonReader");
return person;
}
}
PersonWriter.java
PersonWriter.java
public class PersonWriter implements ItemWriter<Person> {
@Override
public void write(List<? extends Person> arg0) throws Exception {
System.out.println("IN PersonWriter");
}
}
PersonProcessor.java
PersonProcessor.java
public class PersonProcessor implements ItemProcessor<Person, Person> {
@Override
public Person process(Person arg0) throws Exception {
System.out.println("In PersonProcessor");
return arg0;
}
}
推荐答案
一个步骤将运行,直到您的 ItemReader
返回 null.在你的情况下,你的 ItemReader
永远不会(它总是返回一个新的 Person
)所以它永远不会结束.
A step will run until your ItemReader
returns null. In your case, your ItemReader
never does (it always returns a new Person
) so it will never end.
这篇关于在无限循环中运行的 Spring Batch 作业的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!