2017-08-02 10 views
0

バックスバッチジョブを動的に作成することは可能ですかas not a beanスプリングバッチでジョブを動的に作成

私は多くの読者、作家、プロセッサー、および他のタスクレットを作成しました。これらの部分から実行時にジョブを構築する可能性があります。

いくつかのディレクトリに保存されたxmlベースの形式のジョブ記述ファイルがあります。これらのジョブ記述には、ジョブに関する動的な情報(たとえば、このジョブでリーダーとライターが選択したもの)を含めることができます。 プログラムが起動すると、これらのファイルが解析され、対応するジョブを作成する必要があります。

私はこのようにそれを実装すると思う:

@Autowired 
private JobBuilderFactory jobBuilderFactory; 

@Autowired 
private StepBuilderFactory stepBuilderFactory; 

@Autowired 
private ApplicationContext context; 

public Job createJob(MyXmlJobConfig jobConfig) { 

    // My predefined steps in context 

    Step initStep = context.getBean("InitStep", Step.class); 

    Step step1 = context.getBean("MyFirstStep", Step.class); 
    Step step2 = context.getBean("MySecondStep", Step.class); 
    //...... 

    // Mix these steps to build job 

    JobBuilder jobBuilder = jobBuilderFactory.get("myJob"); 
    SimpleJobBuilder simpleJobBuilder = jobBuilder.start(initStep); 


    // Any logic of steps mixing and choosing 
    if(jobConfig.somePredicate()) 
     simpleJobBuilder.next(step1); 
    else 
     simpleJobBuilder.next(step2); 
    //......... 


    //....... 

    return simpleJobBuilder.build(); 
} 

使用例:

JobLauncher jobLauncher = context.getBean(JobLauncher.class); 
MyXmlJobConfig config = getConfigFromFile(); // Loading config from file 

MyCustomJobBuilder myCustomJobBuilder = context.getBean(MyCustomJobBuilder.class); 
Job createdJob = myCustomJobBuilder.createJob(config); 
jobLauncher.run(createdJob, new JobParameters()); 

が正しいの構築作業のこのアプローチはありますか? createdJobはBeanではありません。舞台裏で春のバッチの何かを壊しませんか?

答えて

0

スプリングバッチは、スプリングDIコンテナおよび関連設備を非常に広く使用します。ジョブスコープまたはステップスコープのプロキシBeanは単なる一例です。 XMLベースの定義の解析全体がBeanDefinitionsになります。 BeanにすることなくSpringバッチジョブを構築できますか?確かに。私はそれをお勧めしますか?

ApplicationContextというインスタンスを動的に作成する方法があることに注意してください。Spring Batch AdminとSpring XDは両方ともSpring Batchジョブのインスタンスを動的に作成するためにこの機能を利用しました。最初はApplicationContextという仕事の一部ではないので、この方法をお勧めします。

+0

迅速な対応をありがとう!私は春のバッチと春にはまったく新しいです。 __あなたの答えをもう少し詳しく説明してもらえますか?実行時に自分のジョブでSpringの設定を作成し、この生成された設定に基づいてもう1人の子のApplicationContextを起動できるということでしたか? – JuISe

+0

私は、あなたが表示しているコードの最初のブロックは、 '@ Configuration'で注釈が付けられたクラスになければならないことを意味し、' createJob'メソッドはその上に '@Bean'を持つべきです。そして、あなたが仕事を開始すると、そのクラスから新しい 'ApplicationContext'を作ります(https://docs.spring.io/spring/docs/current/javadoc-api/org/springframework/context/annotation/)。 AnnotationConfigApplicationContext.html)。 –

+0

私は多くの仕事をすることができます(createJobメソッドのすべてのMyXmlJobConfigパラメータ)。プログラムを起動してMyXmlJobConfigをロードする前に、これらのジョブがどのステップから構成されているか分かりません。 createJobメソッドに '@Bean'と' @Scope( "prototype") 'で注釈を付けて、このような' 'context.getBean(" createJob "、configXmlParams)のような仕事をするための機能を得るなら、それは正しいアプローチでしょうか? – JuISe

関連する問題