2017-06-21 39 views
1

1つのデータベースから他のデータベースへのデータ移動を実行し、同じバネバッチを探索する必要があります。アプリケーションのユーザーは、ソースとターゲットのデータソースを、データを移動する必要があるテーブルのリストとともに選択します。実行時にスプリングバッチジョブを作成して起動する方法

は、次のとが必要です:

  1. 仕事を構築するために必要な情報は、当社のウェブアプリケーションから実行時に来る - データソースの詳細とテーブル名のリストを含んでいます。これらの詳細をJob Builderモジュールに送信し、JobLauncherを使用して起動することで、新しいジョブを作成したいと考えています。この求人ビルダーモジュールはどのように書いていますか?
  2. 複数のユーザーがデータ移動要求を並行して発生させる可能性があるため、複数のジョブを作成して適切な順序で実行する方法が必要です。

Javaベースの設定を使用してジョブを作成し、Webコンテナから起動しました。設定は次のようになります

現在、ソースとターゲットのデータソースの詳細をそれぞれのBeanにハードコードしています。 getTables()は、データの移動が必要なテーブル(ハードコード)のリストを返します。仕事あなたの最初の質問に関しては

@RestController 
public class MyController { 
    @Autowired 
    JobLauncher jobLauncher; 

    @Autowired 
    Job job; 

    @RequestMapping("/launchjob") 
    public String handle() throws Exception { 
     try { 
      JobParameters jobParameters = new JobParametersBuilder().addLong("time", new Date().getTime()).toJobParameters(); 
      jobLauncher.run(job, jobParameters); 
     } catch (Exception e) { 

     } 

     return "Done"; 
    } 
} 

答えて

0

を起動

RestControllerは、あなたは間違いなくJavaConfigurationを使用する必要があります。さらに、動的なステップ数(たとえば、コピーする必要があるテーブルごとのステップ)でジョブを作成する場合は、春の豆としてステップを定義しないでください。

私は、ジョブを動的に作成する方法について、いくつかの回答を書いています。

:あなたの2番目の質問についてのいくつかの発言
編集彼らは役に立ち

かもしれないが、それらを見て

まず、通常のJobLauncherを使用していて、SimpleJobLauncherをインスタンス化すると仮定します。つまり、上記のコードで示したように、ジョブパラメータを持つジョブを提供することができます。しかし、提供された「仕事」は「SpringBean」インスタンスである必要はないので、Autowireする必要はありません。したがって、上記の質問の答えに示唆したようにcreate-methodesを使用できます。

第2に、要求ごとにJobインスタンスを動的に作成すると、ジョブパラメータとして設定全体を渡す必要はありません。データソースやテーブルなどの「設定プロパティ」をパラメータとして直接渡すことができます。 "createJob"メソッド。すべての可能なデータソースを事前に把握していなければ、DataSourceインスタンスを「オンザフライで」作成することもできます。

第3に、私はすべてのリクエストを「シングル・ラン」とみなし、「再起動」することはできません。したがって、私は、ユーザー、日付/時刻、データソース名(URL)、コピーするテーブルのリストなどのジョブパラメータにいくつかの「メタ情報」を入れるだけです。私はこの種の情報を、発行された場所を要求するログ/監査のようなものとして使用しますが、ジョブ自体の中の制御パラメータとしてjobparameter-instancesを使用しません(建設中にこれらのパラメータの値を渡すことができますジョブの時間を作成メソッドに渡すことで、ジョブの構造がパラメータに従って作成されるため、実行時に - ジョブパラメータにアクセスできるときは、ジョブパラメータに基づいて何もできません) 。

最後に、要求が失敗した場合(エラーが発生してジョブが終了する)、再試行するには新しい要求を実行するだけで済みますが、この要求は完全に新しい要求であり、既に実行されたジョブ(私は自分の仕事のパラメタに要求時間を追加するので、すべての起動は一意の起動になります)。

編集2: ジョブをBeanとして作成していないとしても、オートワイヤリングを使用しているわけではありません。ここに例があります、私は私の豆を構造化するでしょう。コントローラとの各対話で、ちょうど@Jobscopeを使用して、それぞれのリーダーをannotedする必要がitemreader上で、実行時に手動で物事を行うには必要性を@JobScopeを使用していないことで

@Component 
@EnableBatchProcessing 
@Import() // list with imports as neede 
public class JobCreatorComponent { 

    @Autowire 
    private StepBuilderFactory stepBuilder; 

    @Autowire 
    private JobBuilderFactory jobBuilder; 

    public Job createJob(all the parameters you need) { 
    return jobBuilder.get(). .... 
    } 
} 

@RestController 
@Import(JobCreatorComponent.class) 
public class MyController { 
    @Autowired 
    JobLauncher jobLauncher; 

    @Autowired 
    JobCreatorComponent jobCreator; 

    @RequestMapping("/launchjob") 
    public String handle() throws Exception { 
     try { 
      Job job = jobCreator.createJob(... params ...); 
      JobParameters jobParameters = new JobParametersBuilder().addLong("time", new Date().getTime()).toJobParameters(); 
      jobLauncher.run(job, jobParameters); 
     } catch (Exception e) { 

     } 

     return "Done"; 
    } 
} 
+0

あなたが共有したリンクの投稿の一部が、他の問題を解決するのに役立っています。しかし、主な関心事はまだ残っています。ユーザーがデータの移動を要求したときに、ジョブを作成して実行できるサービスとしてSpringバッチを使用するにはどうすればよいですか。ジョブを起動している間にジョブパラメータを送信すると、複雑なオブジェクト(この場合はデータソースの詳細+データ移動要求の詳細)の送信が制限されているようです。 – ksh

+0

私は私の答えにいくつかの発言を追加しました。 –

+0

あなたの提案によれば、私たちはもう春の豆として仕事を生み出しておらず、私たちのユースケースでうまくいきます。 autowiringがなく、アノテーション(@EnableBatchProcessingなど)が使用されていないため、JobRepositoryおよびJob/Stepビルダーファクトリに対して手動で設定する必要はほとんどありません。この変更のために何かを失ってしまっているのであれば、今懸念しているだけです。一度同じことを分析するとここで更新されます。 – ksh

0

あなたは、新鮮なレコード処理を取得します。

これはオンデマンドジョブの1つで、dbマイグレーションのような目標に対してジョブを実行したり、そのような特定のレポートを得ることができます。

関連する問題