春季批处理作业在无限循环中运行

问题描述:

我正在处理简单的Spring批处理作业。当我启动它的工作在无限循环中运行。它不停止。根据我的调度程序时间,它应该在每10秒钟后运行一次。但是当工作开始时,它不会停止。它只是分别从阅读器,处理器和写入器打印系统信息。我正在创造读者,处理器和作家的工作。我正在通过注释进行所有配置。不是由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

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

public class PersonWriter implements ItemWriter<Person> { 
    @Override 
    public void write(List<? extends Person> arg0) throws Exception { 
     System.out.println("IN PersonWriter"); 
    } 
} 

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),所以它永远不会结束。

+0

是的,它是那么简单。 :) – KSHiTiJ

添加标志以防止读者在无限循环中运行。

读者:

public class PersonReader implements ItemReader<Person> { 
    private boolean batchJobState = false; 

    @Override 
    public Person read() throws Exception, UnexpectedInputException, ParseException, NonTransientResourceException { 
     if(!batchJobState){ 
      Person person = new Person(); 
      System.out.println("In PersonReader"); 
      batchJobState=true; 
      return person; 
     } 
     return null; 
    } 
}