Spring Cloudデータフローによるバッチ処理

1概要

連載のリンク:/spring-cloud-data-stream-stream-processing[first]の記事では、Spring Cloud Data Flowのアーキテクチャコンポーネントと、それを使用してストリーミングデータパイプラインを作成する方法を紹介しました。

無限の量のデータが処理されるストリームパイプラインとは対照的に、 バッチプロセスでは、タスクがオンデマンドで実行される短期間のサービスを簡単に作成できます

** 2ローカルデータフローサーバーとシェル

**

Local Data Flow Server はアプリケーションのデプロイを担当するコンポーネントです。

リンク:/spring-cloud-data-stream-stream-processing[前の記事]では、http://start.spring.io/[Spring Initilizr]を使用して両方をSpring Bootアプリケーションとして設定しました。

server メインクラスに @ EnableDataFlowServer アノテーションを、シェルのメインクラスに @ EnableDataFlowShell アノテーションをそれぞれ追加した後、それらを実行することで起動する準備ができています。

mvn spring-boot:run

サーバーはポート9393で起動し、シェルはプロンプトから対話できるようになります。

ローカルデータフローサーバーとそのシェルクライアントの取得方法と使用方法の詳細については、前の記事を参照できます。

3バッチアプリケーション

サーバーとシェルと同様に、http://start.spring.io/[Spring Initilizr]を使用して root Spring Boot バッチアプリケーションを設定できます。

Webサイトにアクセスしたら、 Group Artifact の名前を選択し、依存関係の検索ボックスから[ Cloud Task ]を選択します。

これが完了したら、 プロジェクトの生成 ボタンをクリックしてMavenアーティファクトのダウンロードを開始します。

成果物は事前構成されており、基本コードが付いています。バッチアプリケーションを作成するために編集する方法を見てみましょう。

3.1. Mavenの依存関係

まず最初に、Mavenの依存関係をいくつか追加しましょう。これはバッチアプリケーションなので、 Spring Batch Project からライブラリをインポートする必要があります。

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-batch</artifactId>
</dependency>

また、Spring Cloudタスクは実行されたタスクの結果を格納するためにリレーショナルデータベースを使用するので、RDBMSドライバに依存関係を追加する必要があります。

<dependency>
    <groupId>com.h2database</groupId>
    <artifactId>h2</artifactId>
</dependency>

Springが提供するH2インメモリデータベースを使用することにしました。これにより、ブートストラップ開発の簡単な方法がわかります。ただし、実稼働環境では、独自の DataSource を設定します。

成果物のバージョンは、Spring Bootの親の pom.xml ファイルから継承されることに注意してください。

** 3.2. メインクラス

必要な機能を有効にするための重要なポイントは、 @ EnableTask および @ EnableBatchProcessing アノテーションを__Spring Bootのメインクラスに追加することです。このクラスレベルのアノテーションは、Spring Cloud Taskにすべてをブートストラップするように指示します。

@EnableTask
@EnableBatchProcessing
@SpringBootApplication
public class BatchJobApplication {

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

3.3. ジョブ構成

最後に、ジョブを設定しましょう。この場合、 String をログファイルに単純に印刷したものです。

@Configuration
public class JobConfiguration {

    private static Log logger
      = LogFactory.getLog(JobConfiguration.class);

    @Autowired
    public JobBuilderFactory jobBuilderFactory;

    @Autowired
    public StepBuilderFactory stepBuilderFactory;

    @Bean
    public Job job() {
        return jobBuilderFactory.get("job")
          .start(stepBuilderFactory.get("jobStep1")
          .tasklet(new Tasklet() {

              @Override
              public RepeatStatus execute(StepContribution contribution,
                ChunkContext chunkContext) throws Exception {

                logger.info("Job was run");
                return RepeatStatus.FINISHED;
              }
        }).build()).build();
    }
}

詳細については、リンク:/Introduction-to-spring-batch[Introduction to Spring Batch]を参照してください。

最後に、アプリケーションの準備が整いました。ローカルのMavenリポジトリ内にインストールしましょう。これを cd してプロジェクトのルートディレクトリに移動し、次のコマンドを発行します。

mvn clean install

これで、アプリケーションを__Data Flow Serverの内側に配置します。

4アプリケーションを登録する

アプリケーションをApp Registryに登録するには、アプリケーションアーティファクトに解決できる固有の名前、アプリケーションタイプ、およびURIを提供する必要があります。

Spring Cloud Data Flow Shell に移動し、プロンプトからコマンドを発行します。

app register --name batch-job --type task
  --uri maven://org.baeldung.spring.cloud:batch-job:jar:0.0.1-SNAPSHOT

5タスクを作成する

タスク定義は、次のコマンドを使用して作成できます。

task create myjob --definition batch-job

これにより、以前に登録されたバッチジョブアプリケーションを指す myjob という名前の新しいタスクが作成されます。

現在のタスク定義のリストは、次のコマンドを使って取得できます。

task list

6. タスクを起動する

タスクを起動するには、次のコマンドを使います。

task launch myjob

タスクが起動されると、タスクの状態はリレーショナルDBに格納されます。次のコマンドでタスク実行のステータスを確認できます。

task execution list

7. 結果を確認する

この例では、ジョブは単にログファイルに文字列を出力します。ログファイルは、 Data Flow Server のログ出力に表示されるディレクトリ内にあります。

結果を見るために、ログを調整することができます。

tail -f PATH__TO__LOG\spring-cloud-dataflow-2385233467298102321\myjob-1472827120414\myjob[...]---[main]o.s.batch.core.job.SimpleStepHandler: Executing step:[jobStep1][...]---[main]o.b.spring.cloud.JobConfiguration: Job was run[...]---[main]o.s.b.c.l.support.SimpleJobLauncher:
  Job:[SimpleJob:[name=job]]completed with the following parameters:
   [{}]and the following status:[COMPLETED]----

[[Conclusion]]

===  **  8結論**

この記事では、Spring Cloud Data Flowを使用してバッチ処理を処理する方法を説明しました。

サンプルコードはhttps://github.com/eugenp/tutorials/tree/master/spring-cloud-data-flow[GitHubプロジェクト]にあります。