2017-03-16 2 views
1

Ich arbeite an einfachen Spring Batch Job. Wenn ich den Job starte, läuft er in einer Endlosschleife. Es hört nicht auf. Gemäß meiner Zeitplanung sollte es alle 10 Sekunden laufen. Aber wenn der Job beginnt, hört es nicht auf. Es druckt nur Sysouts von Reader, Prozessor und Writer. Ich erstelle Job mit Leser, Prozessor und Schriftsteller. Und ich mache alle Konfigurationen durch Anmerkungen. Nicht von XML.Spring Batch Job läuft im Endlosschleife

Hier ist Batch-Konfiguration

@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; 
    } 
} 

Antwort

2

Ein Schritt wird ausgeführt, bis ItemReader null zurückgibt. In Ihrem Fall, Ihre ItemReader wird nie (es gibt immer eine neue Person), so dass es nie enden wird.

+0

Ja, es war so einfach. :) – KSHiTiJ

0

Fügen Sie eine Markierung hinzu, um zu verhindern, dass der Leser in der Endlosschleife läuft.

Reader:

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; 
    } 
} 
Verwandte Themen