2016-08-15 16 views
0

で動的に生成された手順、私は次のことを行い春のバッチ・ジョブを持って実行...春のバッチがタスクレット

ステップ1、ステップ2が作成し

を処理する必要があるオブジェクトのリストを作成します。

実行X工程ステップ2で作成したステップのリストからステップを実行するステップで1

ステップ3トライを作成したオブジェクトのリストにある項目の数に応じて、ステップのリスト下記のexecuteDynamicStepsTasklet()で行います。コードは何のエラーもなく実行されますが、何もしていないようです。私がその方法で持っているものは正しいか?

おかげ

/*

*だから今、私は実行する必要のあるダイナミックなステップのリストを持っていると私は、彼らがStepScopeであると考えている
@Configuration 
public class ExportMasterListCsvJobConfig { 

public static final String JOB_NAME = "exportMasterListCsv"; 
@Autowired 
public JobBuilderFactory jobBuilderFactory; 

@Autowired 
public StepBuilderFactory stepBuilderFactory; 

@Value("${exportMasterListCsv.generateMasterListRows.chunkSize}") 
public int chunkSize; 

@Value("${exportMasterListCsv.generateMasterListRows.masterListSql}") 
public String masterListSql; 

@Autowired 
public DataSource onlineStagingDb; 

@Value("${out.dir}") 
public String outDir; 

@Value("${exportMasterListCsv.generatePromoStartDateEndDateGroupings.promoStartDateEndDateSql}") 
private String promoStartDateEndDateSql; 


private List<DivisionIdPromoCompStartDtEndDtGrouping> divisionIdPromoCompStartDtEndDtGrouping; 

private List<Step> dynamicSteps = Collections.synchronizedList(new ArrayList<Step>()) ; 


@Bean 
public Job exportMasterListCsvJob(
     @Qualifier("createJobDatesStep") Step createJobDatesStep, 
     @Qualifier("createDynamicStepsStep") Step createDynamicStepsStep, 
     @Qualifier("executeDynamicStepsStep") Step executeDynamicStepsStep) { 

    return jobBuilderFactory.get(JOB_NAME) 
      .flow(createJobDatesStep) 
      .next(createDynamicStepsStep) 
      .next(executeDynamicStepsStep) 
      .end().build(); 
} 


@Bean 
public Step executeDynamicStepsStep(
     @Qualifier("executeDynamicStepsTasklet") Tasklet executeDynamicStepsTasklet) { 

    return stepBuilderFactory 
       .get("executeDynamicStepsStep") 
       .tasklet(executeDynamicStepsTasklet) 
       .build();    
} 

@Bean 
public Tasklet executeDynamicStepsTasklet() { 

    return new Tasklet() { 

     @Override 
     public RepeatStatus execute(StepContribution contribution, ChunkContext chunkContext) throws Exception { 
      FlowStep flowStep = new FlowStep(createParallelFlow()); 
      SimpleJobBuilder jobBuilder = jobBuilderFactory.get("myNewJob").start(flowStep); 
      return RepeatStatus.FINISHED; 
     } 
    }; 
} 

public Flow createParallelFlow() { 
    SimpleAsyncTaskExecutor taskExecutor = new SimpleAsyncTaskExecutor(); 
    taskExecutor.setConcurrencyLimit(1); 

    List<Flow> flows = dynamicSteps.stream() 
      .map(step -> new FlowBuilder<Flow>("flow_" + step.getName()).start(step).build()) 
      .collect(Collectors.toList()); 

    return new FlowBuilder<SimpleFlow>("parallelStepsFlow") 
      .split(taskExecutor) 
      .add(flows.toArray(new Flow[flows.size()])) 
      .build(); 
} 

@Bean 

public Step createDynamicStepsStep(
     @Qualifier("createDynamicStepsTasklet") Tasklet createDynamicStepsTasklet) { 

    return stepBuilderFactory 
       .get("createDynamicStepsStep") 
       .tasklet(createDynamicStepsTasklet) 
       .build();    
} 

@Bean 
@JobScope 
public Tasklet createDynamicStepsTasklet() { 

    return new Tasklet() { 

     @Override 
     public RepeatStatus execute(StepContribution contribution, ChunkContext chunkContext) throws Exception { 
      for (DivisionIdPromoCompStartDtEndDtGrouping grp: divisionIdPromoCompStartDtEndDtGrouping){ 

       System.err.println("grp: " + grp); 

       String stepName = "stp_" + grp; 

       String fileName = grp + FlatFileConstants.EXTENSION_CSV; 

       Step dynamicStep = 
         stepBuilderFactory.get(stepName) 
         .<MasterList,MasterList> chunk(10) 
         .reader(queryStagingDbReader(
           grp.getDivisionId(), 
           grp.getRpmPromoCompDetailStartDate(), 
           grp.getRpmPromoCompDetailEndDate())) 
         .writer(masterListFileWriter(fileName))         
         .build(); 

       dynamicSteps.add(dynamicStep); 

      } 
      System.err.println("createDynamicStepsTasklet dynamicSteps: " + dynamicSteps); 
      return RepeatStatus.FINISHED; 
     } 
    }; 
} 


public FlatFileItemWriter<MasterList> masterListFileWriter(String fileName) { 
    FlatFileItemWriter<MasterList> writer = new FlatFileItemWriter<>(); 
    writer.setResource(new FileSystemResource(new File(outDir, fileName))); 
    writer.setHeaderCallback(masterListFlatFileHeaderCallback()); 
    writer.setLineAggregator(masterListFormatterLineAggregator()); 
    return writer; 
} 

*/

。誰かがそれらを実行する方法について私に助言することができます

答えて

0

これは動作しません。あなたのタスクレットは、最初のステップとしてFlowStepを持つジョブを作成するだけです。 jobBuilderfactoryを使用すると、ジョブが作成されます。それはそれを起動しません。 methodname "start"は最初のステップしか定義していないので、誤解を招く可能性があります。しかし、それは仕事を開始しません。

ジョブが開始されると、ジョブ(そのステップとサブステップ)の構造を変更することはできません。したがって、ステップ1で計算されたものに基づいて、ステップ2でフローステップを設定することはできません(もちろん、バネバッチ構造の内部をさらにハッキングして豆を修正することもできます...しかし、 tはそれをしたい)。

あなたの仕事を構成するクラスに注入された適切なpostConstructメソッドで一種の "SetupBean"を使用することをお勧めします。この "SetupBean"は、処理されているオブジェクトのリストを計算します。

@Component 
public class SetUpBean { 

    private List<Object> myObjects; 

    @PostConstruct 
    public afterPropertiesSet() { 
    myObjects = ...; 
    } 

    public List<Object> getMyObjects() { 
    return myObjects; 
    } 
} 

@Configuration 
public class JobConfiguration { 

    @Autowired 
    private JobBuilderFactory jobBuilderFactory; 

    @Autowired 
    private StepBuilderFactory stepBuilderFactory; 

    @Autowired 
    private SetUpBean setup; 

    ... 
} 
+0

ありがとうございます。そのsetupBeanでは、JobScopeアノテーションを使用してjobParametersにアクセスすることは可能ですか? – Richie

+0

ジョブが実行されていないため、ジョブスコープが存在しないため、JobScopeアノテーションは効果を持ちません。 jobParametersをcommandLine-Argumentsとして指定しますか? SpringBootを使って仕事を始めていますか? –

+0

私は自分のユーザーが残りのエンドポイントを介してジョブを実行しているので、コマンドライン引数はオプションではありません。私はあなたの脳を拾って、データのいくつかのキーに基づいて複数の出力ファイルにあなたのリーダーデータを分割しなければならないかどうか尋ねることができますか? – Richie

関連する問題