2017-08-29 12 views
1

私はCSVファイルからいくつかのデータを読み込み、データベースに入れるためにSpring Batchを使用しています。 私のバッチジョブは2段階の化合物である必要があります(..名、拡張子、コンテンツ)CSVから スプリングバッチの作成方法は前のステップに依存しますか?

  • 読むライン

    1. チェックファイルやDBに保存(ItemReader、ItemProcessor、 ItemWriter ...)
    Step 1がエラー発生した場合Step 2を実行してはいけません

    (適合していないファイルは、ファイルが存在していませんが...)

    FYI、私はXMLのconfiguraなし春のバッチを使用しています!唯一の注釈:ドキュメントは、あなたが以前の状態から終了状態が一致する場合、新しい状態への移行を開始する「上」メソッドを使用することができます指定したよう

    @Configuration 
    @EnableBatchProcessing 
    public class ProductionOutConfig { 
    
        @Autowired 
        private StepBuilderFactory steps; 
    
        @Autowired 
        private JobBuilderFactory jobBuilderFactory; 
    
    
        @Autowired 
        private ProductionOutTasklet productionOutTasklet; 
    
        @Autowired 
        private CheckFilesForProdTasklet checkFilesForProdTasklet; 
    
        @Bean 
        public Job productionOutJob(@Qualifier("productionOut")Step productionOutStep, 
               @Qualifier("checkFilesForProd") Step checkFilesForProd){ 
         return jobBuilderFactory.get("productionOutJob").start(checkFilesForProd).next(productionOutStep).build(); 
        } 
    
        @Bean(name="productionOut") 
        public Step productionOutStep(){ 
         return steps.get("productionOut"). 
           tasklet(productionOutTasklet) 
           .build();} 
    
        @Bean(name = "checkFilesForProd") 
        public Step checkFilesForProd(){ 
         return steps.get("checkFilesForProd") 
           .tasklet(checkFilesForProdTasklet) 
           .build(); 
        } 
    } 
    
  • 答えて

    2

    は、既に前のステップが失敗した場合、すなわち次のステップが実行されないでしょう春のバッチのデフォルトの動作です。現在のステップを失敗ステップとしてマークするには、キャッチされていない実行時例外をスローする必要があります。

    例外が処理されない場合、スプリングバッチはそのステップを失敗としてマークし、次のステップは実行されません。したがって、失敗したシナリオで例外をスローするだけです。複雑なジョブの場合

    が流れて、あなたが使用することを好むかもしれない - JobExecutionDeciderProgrammatic Flow Decisions

    1

    :ここに は、私の仕事の設定クラスは次のようになります。与えられたパターン。

    あなたのコードは次のようなものと同様にすることができる:あなたが探しているものを

    return jobBuilderFactory.get("productionOutJob") 
          .start(checkFilesForProd) 
          .on(ExitStatus.FAILED.getExitCode()).end() 
          .from(checkFilesForProd) 
          .on("*") 
          .to(productionOutStep) 
          .build(); 
    
    +0

    私はこのように変更: 'jobBuilderFactory.get( "productionOutJob") .start(checkFilesForProd) .on(ExitStatus.FAILEDを返します。 。getExitCode())エンド() .from(productionOutStep) .END() .build(); ' 私は、論理的にはそれが正しいことだと思うが、今、私は' ExitStatus.FAILED'を返す切り替える方法を見つけることができませんでした'CheckFilesForProdTasklet'の' ExitStatus.COMPLETED' –

    +0

    申し訳ありません、私はあなたのタスクの順序を最初のswer。これはどうですか ? リターンjobBuilderFactory.get( "productionOutJob") .start(checkFilesForProd) .on(ExitStatus.FAILED.getExitCode())。エンド() .from(checkFilesForProd) .on(ALL_PATTERN) .TO(productionOutStep ) .build(); あなたが期待している結果ですか? – mabad

    +0

    1 - ALL_PATTERNは不明ですが、結果が何であっても意味しますか? 2番目の質問は、ビジネスロジックに応じて、自分のタスクレットでExitStatus.FAILEDとExitStatus.COMPLETEDを返す方法です。 –

    関連する問題