2016-01-19 20 views
1

我的要求:創建一個調度程序來定期調用批處理,並且在批處理內部,我需要兩個步驟。 StepA將開始運行並相應地得到結果,StepB將會調用。 如果你看看控制檯日誌,你會看到stepA被多次調用,比方說,完全相同的時刻。根據@Scheduled(fixedRate = 60000),每分鐘應該只有一個電話。考慮到這個問題與Scheduller沒有任何關係,因爲我刪除了調度表,並且遇到了類似的問題。其他相關的問題是,StepB永遠不會被調用。我試圖創建customDecider(「... next(customDecider()」)並創建一個私有方法來返回JobExecutionDecider。看起來這兩個都沒有生效。我最好的猜測是池線程是導致一些「無限循環」的步驟A,因爲我沒有設置正確的東西,但我沒有發現什麼可以吧。流程中有兩個步驟的彈簧批次。爲什麼第二步從不運行,第一步是無限循環

BatchConfig.java

/*@Bean 
    public JobExecutionDecider customDecider() throws Exception{ 
      return new CustomDecider(); 
    }*/ 

    private JobExecutionDecider decider(boolean decision){ 
      return(jobExecution, stepExecution) -> new FlowExecutionStatus(decision ? "OK" : "FAILED"); 
    } 


    @Bean 
    public Job job(Step stepA, Step stepB) { 
      return jobBuilderFactory.get("job1") 
         //.flow(stepA).on("FAILED").to(stepB).end().build(); 
         .start(stepA).next(decider(true)).on("FAILED").stop().from(stepA).next(stepB).build().build(); 

    } 

    @Bean 
    public Step stepA(ItemReader<String> readerA, ItemWriter<String> writerA) { 
      return stepBuilderFactory.get("stepA").<String, String> chunk(1) 
         .reader(readerA).writer(writerA).allowStartIfComplete(true) 
         .build(); 

    } 

    @Bean 
    @StepScope 
    public ItemReader<String> readerA() { 
      return new CustomItemReaderA(); 

    } 

    @Bean 
    public ItemWriter<String> writerA() { 
      return new CustomItemWriterA(); 

    } 

    @Bean 
    public Step stepB(ItemReader<String> readerB, ItemWriter<String> writerB) { 
      return stepBuilderFactory.get("stepB").<String, String> chunk(1) 
         .reader(readerB).writer(writerB).allowStartIfComplete(true) 
         .build(); 

    } 

    @Bean 
    @StepScope 
    public ItemReader<String> readerB() { 
      return new CustomItemReaderB(); 

    } 

    @Bean 
    public ItemWriter<String> writerB() { 
      return new CustomItemWriterB(); 

    } 

CustomDecider.java

public class CustomDecider implements JobExecutionDecider { 


     @Override 
     public FlowExecutionStatus decide(JobExecution jobExecution, 
        StepExecution stepExecution) { 
       return new FlowExecutionStatus("OK"); 
     } 

} 

CustomItemReaderA 

public class CustomItemReaderA implements ItemReader<String>{ 

     private static final Logger log = LoggerFactory.getLogger(CustomItemReaderA.class); 
     @Override 
     public String read() throws Exception, UnexpectedInputException, 
        ParseException, NonTransientResourceException { 
       log.info("rA"); 
       return "A"; 
     } 

} 

CustomItemWriterA 
public class CustomItemWriterA implements ItemWriter<String> { 

     private static final Logger log = LoggerFactory.getLogger(CustomItemWriterA.class); 
     @Override 
     public void write(List<? extends String> items) throws Exception { 
       log.info("wA"); 

     } 

} 

CustomItemReaderB和CustomItemReaderB是相同的自定義...一個剛剛從改變log.info期間到B字母和返回

控制檯登錄

2016-01-18 21:40:37.488 INFO 7340 --- [pool-2-thread-1] com.example.CustomItemReaderA   : rA 
2016-01-18 21:40:37.488 INFO 7340 --- [pool-2-thread-1] com.example.CustomItemWriterA   : wA 
2016-01-18 21:40:37.488 INFO 7340 --- [pool-2-thread-1] com.example.CustomItemReaderA   : rA 
2016-01-18 21:40:37.488 INFO 7340 --- [pool-2-thread-1] com.example.CustomItemWriterA   : wA 
2016-01-18 21:40:37.488 INFO 7340 --- [pool-2-thread-1] com.example.CustomItemReaderA   : rA 
2016-01-18 21:40:37.488 INFO 7340 --- [pool-2-thread-1] com.example.CustomItemWriterA   : wA 
2016-01-18 21:40:37.488 INFO 7340 --- [pool-2-thread-1] com.example.CustomItemReaderA   : rA 
2016-01-18 21:40:37.488 INFO 7340 --- [pool-2-thread-1] com.example.CustomItemWriterA   : wA 
2016-01-18 21:40:37.488 INFO 7340 --- [pool-2-thread-1] com.example.CustomItemReaderA   : rA 
2016-01-18 21:40:37.488 INFO 7340 --- [pool-2-thread-1] com.example.CustomItemWriterA   : wA 
2016-01-18 21:40:37.488 INFO 7340 --- [pool-2-thread-1] com.example.CustomItemReaderA   : rA 
2016-01-18 21:40:37.488 INFO 7340 --- [pool-2-thread-1] com.example.CustomItemWriterA   : wA 
2016-01-18 21:40:37.488 INFO 7340 --- [pool-2-thread-1] com.example.CustomItemReaderA   : rA 
2016-01-18 21:40:37.488 INFO 7340 --- [pool-2-thread-1] com.example.CustomItemWriterA   : wA 
2016-01-18 21:40:37.488 INFO 7340 --- [pool-2-thread-1] com.example.CustomItemReaderA   : rA 
2016-01-18 21:40:37.488 INFO 7340 --- [pool-2-thread-1] com.example.CustomItemWriterA   : wA 
2016-01-18 21:40:37.488 INFO 7340 --- [pool-2-thread-1] com.example.CustomItemReaderA   : rA 
2016-01-18 21:40:37.488 INFO 7340 --- [pool-2-thread-1] com.example.CustomItemWriterA   : wA 
2016-01-18 21:40:37.488 INFO 7340 --- [pool-2-thread-1] com.example.CustomItemReaderA   : rA 
2016-01-18 21:40:37.488 INFO 7340 --- [pool-2-thread-1] com.example.CustomItemWriterA   : wA 
2016-01-18 21:40:37.488 INFO 7340 --- [pool-2-thread-1] com.example.CustomItemReaderA   : rA 
2016-01-18 21:40:37.488 INFO 7340 --- [pool-2-thread-1] com.example.CustomItemWriterA   : wA 
2016-01-18 21:40:37.488 INFO 7340 --- [pool-2-thread-1] com.example.CustomItemReaderA   : rA 
2016-01-18 21:40:37.488 INFO 7340 --- [pool-2-thread-1] com.example.CustomItemWriterA   : wA 
2016-01-18 21:40:37.488 INFO 7340 --- [pool-2-thread-1] com.example.CustomItemReaderA   : rA 
2016-01-18 21:40:37.488 INFO 7340 --- [pool-2-thread-1] com.example.CustomItemWriterA   : wA 
2016-01-18 21:40:37.488 INFO 7340 --- [pool-2-thread-1] com.example.CustomItemReaderA   : rA 
2016-01-18 21:40:37.488 INFO 7340 --- [pool-2-thread-1] com.example.CustomItemWriterA   : wA 
2016-01-18 21:40:37.488 INFO 7340 --- [pool-2-thread-1] com.example.CustomItemReaderA   : rA 
2016-01-18 21:40:37.488 INFO 7340 --- [pool-2-thread-1] com.example.CustomItemWriterA   : wA 
2016-01-18 21:40:37.488 INFO 7340 --- [pool-2-thread-1] com.example.CustomItemReaderA   : rA 
2016-01-18 21:40:37.488 INFO 7340 --- [pool-2-thread-1] com.example.CustomItemWriterA   : wA 
2016-01-18 21:40:37.488 INFO 7340 --- [pool-2-thread-1] com.example.CustomItemReaderA   : rA 
2016-01-18 21:40:37.488 INFO 7340 --- [pool-2-thread-1] com.example.CustomItemWriterA   : wA 
2016-01-18 21:40:37.488 INFO 7340 --- [pool-2-thread-1] com.example.CustomItemReaderA   : rA 
2016-01-18 21:40:37.488 INFO 7340 --- [pool-2-thread-1] com.example.CustomItemWriterA   : wA 
2016-01-18 21:40:37.488 INFO 7340 --- [pool-2-thread-1] com.example.CustomItemReaderA   : rA 
2016-01-18 21:40:37.488 INFO 7340 --- [pool-2-thread-1] com.example.CustomItemWriterA   : wA 
2016-01-18 21:40:37.488 INFO 7340 --- [pool-2-thread-1] com.example.CustomItemReaderA   : rA 
2016-01-18 21:40:37.488 INFO 7340 --- [pool-2-thread-1] com.example.CustomItemWriterA   : wA 
2016-01-18 21:40:37.504 INFO 7340 --- [pool-2-thread-1] com.example.CustomItemReaderA   : rA 
2016-01-18 21:40:37.504 INFO 7340 --- [pool-2-thread-1] com.example.CustomItemWriterA   : wA 
2016-01-18 21:40:37.504 INFO 7340 --- [pool-2-thread-1] com.example.CustomItemReaderA   : rA 
2016-01-18 21:40:37.504 INFO 7340 --- [pool-2-thread-1] com.example.CustomItemWriterA   : wA 
2016-01-18 21:40:37.504 INFO 7340 --- [pool-2-thread-1] com.example.CustomItemReaderA   : rA 
2016-01-18 21:40:37.504 INFO 7340 --- [pool-2-thread-1] com.example.CustomItemWriterA   : wA 
2016-01-18 21:40:37.504 INFO 7340 --- [pool-2-thread-1] com.example.CustomItemReaderA   : rA 
2016-01-18 21:40:37.504 INFO 7340 --- [pool-2-thread-1] com.example.CustomItemWriterA   : wA 
2016-01-18 21:40:37.504 INFO 7340 --- [pool-2-thread-1] com.example.CustomItemReaderA   : rA 
2016-01-18 21:40:37.504 INFO 7340 --- [pool-2-thread-1] com.example.CustomItemWriterA   : wA 
2016-01-18 21:40:37.504 INFO 7340 --- [pool-2-thread-1] com.example.CustomItemReaderA   : rA 
2016-01-18 21:40:37.504 INFO 7340 --- [pool-2-thread-1] com.example.CustomItemWriterA   : wA 
2016-01-18 21:40:37.504 INFO 7340 --- [pool-2-thread-1] com.example.CustomItemReaderA   : rA 
2016-01-18 21:40:37.504 INFO 7340 --- [pool-2-thread-1] com.example.CustomItemWriterA   : wA 
2016-01-18 21:40:37.504 INFO 7340 --- [pool-2-thread-1] com.example.CustomItemReaderA   : rA 
2016-01-18 21:40:37.504 INFO 7340 --- [pool-2-thread-1] com.example.CustomItemWriterA   : wA 
2016-01-18 21:40:37.504 INFO 7340 --- [pool-2-thread-1] com.example.CustomItemReaderA   : rA 
2016-01-18 21:40:37.504 INFO 7340 --- [pool-2-thread-1] com.example.CustomItemWriterA   : wA 
2016-01-18 21:40:37.504 INFO 7340 --- [pool-2-thread-1] com.example.CustomItemReaderA   : rA 
2016-01-18 21:40:37.504 INFO 7340 --- [pool-2-thread-1] com.example.CustomItemWriterA   : wA 
2016-01-18 21:40:37.504 INFO 7340 --- [pool-2-thread-1] com.example.CustomItemReaderA   : rA 
2016-01-18 21:40:37.504 INFO 7340 --- [pool-2-thread-1] com.example.CustomItemWriterA   : wA 
2016-01-18 21:40:37.504 INFO 7340 --- [pool-2-thread-1] com.example.CustomItemReaderA   : rA 
2016-01-18 21:40:37.504 INFO 7340 --- [pool-2-thread-1] com.example.CustomItemWriterA   : wA 
2016-01-18 21:40:37.504 INFO 7340 --- [pool-2-thread-1] com.example.CustomItemReaderA   : rA 
2016-01-18 21:40:37.504 INFO 7340 --- [pool-2-thread-1] com.example.CustomItemWriterA   : wA 
2016-01-18 21:40:37.504 INFO 7340 --- [pool-2-thread-1] com.example.CustomItemReaderA   : rA 
2016-01-18 21:40:37.504 INFO 7340 --- [pool-2-thread-1] com.example.CustomItemWriterA   : wA 
2016-01-18 21:40:37.519 INFO 7340 --- [pool-2-thread-1] com.example.CustomItemReaderA   : rA 
2016-01-18 21:40:37.519 INFO 7340 --- [pool-2-thread-1] com.example.CustomItemWriterA   : wA 
2016-01-18 21:40:37.519 INFO 7340 --- [pool-2-thread-1] com.example.CustomItemReaderA   : rA 
2016-01-18 21:40:37.519 INFO 7340 --- [pool-2-thread-1] com.example.CustomItemWriterA   : wA 
2016-01-18 21:40:37.519 INFO 7340 --- [pool-2-thread-1] com.example.CustomItemReaderA   : rA 
2016-01-18 21:40:37.519 INFO 7340 --- [pool-2-thread-1] com.example.CustomItemWriterA   : wA 
2016-01-18 21:40:37.519 INFO 7340 --- [pool-2-thread-1] com.example.CustomItemReaderA   : rA 
2016-01-18 21:40:37.519 INFO 7340 --- [pool-2-thread-1] com.example.CustomItemWriterA   : wA 
2016-01-18 21:40:37.519 INFO 7340 --- [pool-2-thread-1] com.example.CustomItemReaderA   : rA 
2016-01-18 21:40:37.519 INFO 7340 --- [pool-2-thread-1] com.example.CustomItemWriterA   : wA 
2016-01-18 21:40:37.519 INFO 7340 --- [pool-2-thread-1] com.example.CustomItemReaderA   : rA 
2016-01-18 21:40:37.519 INFO 7340 --- [pool-2-thread-1] com.example.CustomItemWriterA   : wA 
2016-01-18 21:40:37.519 INFO 7340 --- [pool-2-thread-1] com.example.CustomItemReaderA   : rA 
2016-01-18 21:40:37.519 INFO 7340 --- [pool-2-thread-1] com.example.CustomItemWriterA   : wA 
2016-01-18 21:40:37.519 INFO 7340 --- [pool-2-thread-1] com.example.CustomItemReaderA   : rA 
2016-01-18 21:40:37.519 INFO 7340 --- [pool-2-thread-1] com.example.CustomItemWriterA   : wA 
2016-01-18 21:40:37.519 INFO 7340 --- [pool-2-thread-1] com.example.CustomItemReaderA   : rA 
2016-01-18 21:40:37.519 INFO 7340 --- [pool-2-thread-1] com.example.CustomItemWriterA   : wA 
2016-01-18 21:40:37.519 INFO 7340 --- [pool-2-thread-1] com.example.CustomItemReaderA   : rA 
2016-01-18 21:40:37.519 INFO 7340 --- [pool-2-thread-1] com.example.CustomItemWriterA   : wA 
2016-01-18 21:40:37.519 INFO 7340 --- [pool-2-thread-1] com.example.CustomItemReaderA   : rA 
2016-01-18 21:40:37.519 INFO 7340 --- [pool-2-thread-1] com.example.CustomItemWriterA   : wA 
2016-01-18 21:40:37.519 INFO 7340 --- [pool-2-thread-1] com.example.CustomItemReaderA   : rA 
2016-01-18 21:40:37.519 INFO 7340 --- [pool-2-thread-1] com.example.CustomItemWriterA   : wA 
2016-01-18 21:40:37.519 INFO 7340 --- [pool-2-thread-1] com.example.CustomItemReaderA   : rA 
2016-01-18 21:40:37.519 INFO 7340 --- [pool-2-thread-1] com.example.CustomItemWriterA   : wA 
2016-01-18 21:40:37.519 INFO 7340 --- [pool-2-thread-1] com.example.CustomItemReaderA   : rA 
2016-01-18 21:40:37.519 INFO 7340 --- [pool-2-thread-1] com.example.CustomItemWriterA   : wA 
2016-01-18 21:40:37.519 INFO 7340 --- [pool-2-thread-1] com.example.CustomItemReaderA   : rA 
2016-01-18 21:40:37.519 INFO 7340 --- [pool-2-thread-1] com.example.CustomItemWriterA   : wA 
2016-01-18 21:40:37.519 INFO 7340 --- [pool-2-thread-1] com.example.CustomItemReaderA   : rA 
2016-01-18 21:40:37.519 INFO 7340 --- [pool-2-thread-1] com.example.CustomItemWriterA   : wA 
2016-01-18 21:40:37.519 INFO 7340 --- [pool-2-thread-1] com.example.CustomItemReaderA   : rA 
2016-01-18 21:40:37.519 INFO 7340 --- [pool-2-thread-1] com.example.CustomItemWriterA   : wA 
2016-01-18 21:40:37.519 INFO 7340 --- [pool-2-thread-1] com.example.CustomItemReaderA   : rA 
2016-01-18 21:40:37.519 INFO 7340 --- [pool-2-thread-1] com.example.CustomItemWriterA   : wA 
2016-01-18 21:40:37.519 INFO 7340 --- [pool-2-thread-1] com.example.CustomItemReaderA   : rA 
2016-01-18 21:40:37.519 INFO 7340 --- [pool-2-thread-1] com.example.CustomItemWriterA   : wA 
2016-01-18 21:40:37.519 INFO 7340 --- [pool-2-thread-1] com.example.CustomItemReaderA   : rA 
2016-01-18 21:40:37.519 INFO 7340 --- [pool-2-thread-1] com.example.CustomItemWriterA   : wA 
and so on ... 

調度

@Component 
public class QueueScheduler { 

     private static final Logger log = LoggerFactory 
        .getLogger(QueueScheduler.class); 

    private Job job; 
    private JobLauncher jobLauncher; 

    @Autowired 
    public QueueScheduler(JobLauncher jobLauncher, @Qualifier("job") Job job){ 
     this.job = job; 
     this.jobLauncher = jobLauncher; 
    } 



    @Scheduled(fixedRate=60000) 
    public void runJob(){ 
      try{ 
     jobLauncher.run(job, new JobParameters()); 
      }catch(Exception ex){ 
       log.info(ex.getMessage()); 
      } 
    } 
} 

回答

2

問題是與你的CustomItemReaderA。您需要告訴讀者何時停止「讀取」數據。如果您修改閱讀器,如下所示,執行將按預期發生。

public class CustomItemReaderA implements ItemReader<String> { 
    private static final Logger log = LoggerFactory 
      .getLogger(CustomItemReaderA.class); 
    private int readCount = 0; 

    @Override 
    public String read() throws Exception, UnexpectedInputException, 
      ParseException, NonTransientResourceException { 
     log.info("Inside CustomItemReaderA"); 
     if (readCount == 1) { 
      return null; 
     } 
     readCount++; 
     return "Read CustomItemReaderA"; 
    } 
} 
+0

那麼,是通過返回null來停止CustomItemReaderA的唯一方法嗎?爲了避免重複調用(僅爲返回null),如果第一次成功,我可以創建一個邏輯以返回null。如果ItemReader設計時考慮到了這種想法,那麼對於這種情況就沒有問題,但假設有一個CustomItemProcessorA期望來自CustomItemReaderA和CustomItemWriterA的讀取數據期望來自CustomItemReaderB的已處理數據,不會返回null break這樣的批處理的目的或迫使我做一個醜陋的解決方法?或者是否必須至少閱讀兩遍? –

+0

其他疑問非常接近最後一個:在我的要求中,我必須根據CustomItemReaderA來決定是否調用CustomItemReaderB。爲此,我明白我必須使用JobExecutionDecider,並通過... on(FlowExecutionStatus)來決定它。我如何從CustomItemReaderA中更改狀態?那麼,只考慮兩個選項,(失敗或成功),我可以使用return null來取得成功,並拋出失敗的異常。但是,讓我們考慮三個選項?如何從CustomItemReaderA返回三種狀態之一?我可以從CustomItemReaderA中更改FlowExecutionStatus嗎? –

+0

我仍然經常在看這個線程。 –

相關問題