2017-03-07 7 views
0

私は3つの別々のジョブをJobStepに組み込んだ複雑なジョブフローを持っています。そしてJobStepをジョブから呼び出します。呼び出しジョブから並行して実行されるJobStepsは4つあります。Springバッチジョブに単純な文字列を渡す方法

文字列をパラメータとして渡す必要があります。

やや単純化されたコード:このような

私の主なルックス:JobStepsの

public static void main(String[] args) { 
     SpringApplication.run(SomeApplication.class, args); 
} 

一つの残りの部分を実行し、トップの仕事は

のように見えます

@Bean 
public JobStep jobStep1(<snip>){ 
     <snip for clarity> 
     JobStep jobStep = new JobStep() ; 
     jobStep.setJob(jobs.get(jobName) 
       .incrementer(new RunIdIncrementer()).listener(listener) 
       .start(Flow1) 
       .next(Flow2) 
       .next(Flow3) 
       .end().build()); 
     jobStep.setJobRepository(jobRepository); 
     jobStep.setJobLauncher(jobLauncher); 
     return jobStep; 
} 

のように見えます

@Bean 
    public Job parentJob(<snip>) { 

     Flow childJobFlow = new FlowBuilder<SimpleFlow>("childJob").start(job1).build(); 
     Flow childJobFlow2 = new FlowBuilder<SimpleFlow>("childJob2").start(job2).build(); 

     FlowBuilder<SimpleFlow> builder = new FlowBuilder<SimpleFlow>("jobFlow"); 
     Flow jobFLow = builder.split(new SimpleAsyncTaskExecutor()).add(childJobFlow,childJobFlow2).build(); 

     return jobs.get("parentJob") 
       .incrementer(new RunIdIncrementer()).listener(listener) 
       .start(jobFLow)    
       .end().build(); 

    } 

別の文字列を取得するために、それぞれのJobStepが必要です。

+0

Partitionerをご覧ください。あなたはそれを使用してデータをステップに渡すことができます –

答えて

0

Nghia Doは、Partitionerを使用して彼のコメントで示唆したように達成できました。パーティショナーを使用すると、文字列をコンテキストにプッシュしてから@Before Stepで文字列を取得できました。

私が持っている私のItemReaderで

@BeforeStep 
public void beforeStep(StepExecution stepExecution) throws Exception { 
    this.stepExecution = stepExecution.getExecutionContext(); 
    this.keyString = stepExecution.getString("keyString"); 
} 

Paritioner

@Override 
public Map<String, ExecutionContext> partition(int gridSize) { 
    Map<String, ExecutionContext> partitionMap = new HashMap<String, ExecutionContext>(); 
    List<String> codes = getCodes(); 

    for (String code : codes) 
    { 
     ExecutionContext context = new ExecutionContext(); 
     context.put("keyString", code); 
     partitionMap.put(code, context); 
    } 
    return partitionMap; 
} 

getCodesは、テストのための文字列のリストを返すこと今だけのプレースホルダ機能です。最終的には、より有用なものに置き換えられます。その後、私は私の既存のステップと呼ばれるマスター一歩を踏み出すていた段階取得する

private List<String> getCodes() { 
     ArrayList<String> result = new ArrayList<String>(); 
     result.add("One"); 
     result.add("Two"); 
     result.add("Three");  
     result.add("Four"); 
     result.add("Five"); 
     result.add("Six"); 
     result.add("Seven"); 
     return result; 
    } 

@Bean 
    public Step masterStep(@Value("#{proccessFilesStep}") Step readFilesStep) { 

     return stepBuilders.get("masterStep") 
       .partitioner(readFilesStep) 
       .partitioner("proccessFilesStep", partitioner()) 
       .taskExecutor(taskExecutor()) 
       .build(); 

    } 

そしてstepBuildersは次のとおりです。

@Autowired 
    private StepBuilderFactory stepBuilders; 

は上の20回の異なる例のように組み合わせるために持っていましたすべてのピースを手に入れるためにネットを使い、それを必要とする次の人のために私はこの答えにすべてを入れています。

関連する問題