Spring Cloudタスクの紹介

Spring Cloudタスクの紹介

1. 概要

The goal of Spring Cloud Task is to provide the functionality of creating short-lived microservices for Spring Boot application

Spring Cloud Taskでは、タスクを動的に実行し、オンデマンドでリソースを割り当て、タスクの完了後に結果を取得するという柔軟性があります。

Tasks is a new primitive within Spring Cloud Data Flow allowing users to execute virtually any Spring Boot application as a short-lived task

2. 簡単なタスクアプリケーションの開発

2.1. 関連する依存関係の追加

まず、spring-cloud-task-dependencies:を使用して依存関係管理セクションを追加できます


    
        
            org.springframework.cloud
            spring-cloud-task-dependencies
            1.2.2.RELEASE
            pom
            import
        
    

この依存関係管理は、インポートスコープを介して依存関係のバージョンを管理します。

次の依存関係を追加する必要があります。


    org.springframework.cloud
    spring-cloud-starter-task


    org.springframework.cloud
    spring-cloud-task-core

Thisは、spring-cloud-task-coreのMavenCentralへのリンクです。

ここで、Spring Bootアプリケーションを起動するには、関連する親を持つspring-boot-starterが必要です。

Spring Data JPAをORMツールとして使用するので、その依存関係も追加する必要があります。


    org.springframework.boot
    spring-boot-starter-data-jpa
    1.5.10

Spring DataJPAを使用した単純なSpringBootアプリケーションのブートストラップの詳細は、hereで入手できます。

spring-boot-starter-parent onMaven Centralの最新バージョンを確認できます。

2.2. @EnableTask注釈

Spring Cloud Taskの機能をブートストラップするには、@EnableTaskアノテーションを追加する必要があります。

@SpringBootApplication
@EnableTask
public class TaskDemo {
    // ...
}

The annotation brings SimpleTaskConfiguration class in the picture which in turns registers the TaskRepository and its infrastructure。 デフォルトでは、メモリ内マップを使用してTaskRepositoryのステータスが保存されます。

TaskRepositoryの主要な情報は、TaskExecutionクラスでモデル化されます。 このクラスの注記されているフィールドは、taskNamestartTimeendTimeexitMessageです。 exitMessageは、終了時に利用可能な情報を格納します。

アプリケーションのいずれかのイベントの失敗が出口の原因である場合、完全な例外スタックトレースがここに保存されます。

Spring Boot provides an interface ExitCodeExceptionMapper which maps uncaught exceptions to exit codes allowing scrutinized debug。 Cloud Taskは、将来の分析のために情報をデータソースに保存します。

2.3. TaskRepositoryDataSourceの構成

TaskRepositoryを格納するメモリ内マップは、タスクが終了すると消え、タスクイベントに関連するデータが失われます。 永続ストレージに保存するために、Spring DataJPAのデータソースとしてMySQLを使用します。

データソースはapplication.ymlファイルで構成されます。 提供されたデータソースをTaskRepositoryのストレージとして使用するようにSpring Cloud Taskを構成するには、DefaultTaskConfigurerを拡張するクラスを作成する必要があります。

これで、構成済みのDatasourceをコンストラクター引数としてスーパークラスのコンストラクターに送信できます。

@Autowired
private DataSource dataSource;

public class HelloWorldTaskConfigurer extends DefaultTaskConfigurer{
    public HelloWorldTaskConfigurer(DataSource dataSource){
        super(dataSource);
    }
}

上記の構成を実行するには、DataSourceのインスタンスに@Autowiredアノテーションを付け、そのインスタンスを上記で定義したHelloWorldTaskConfigurerBeanのコンストラクター引数として挿入する必要があります。

@Bean
public HelloWorldTaskConfigurer getTaskConfigurer() {
    return new HelloWorldTaskConfigurer(dataSource);
}

これで、TaskRepositoryをMySQLデータベースに保存するための構成が完了しました。

2.4. 実装

Spring Bootでは、we can execute any Task just before application finishes its startup.ApplicationRunnerまたはCommandLineRunnerインターフェースを使用して、単純なタスクを作成できます。

これらのインターフェースのrunメソッドを実装し、実装クラスをBeanとして宣言する必要があります。

@Component
public static class HelloWorldApplicationRunner
  implements ApplicationRunner {

    @Override
    public void run(ApplicationArguments arg0) throws Exception {
        System.out.println("Hello World from Spring Cloud Task!");
    }
}

ここで、アプリケーションを実行すると、タスクのイベントデータを記録するMySQLデータベースに作成された必要なテーブルで必要な出力を生成するタスクを取得する必要があります。

3. SpringCloudタスクのライフサイクル

最初に、TaskRepositoryにエントリを作成します。 これは、すべてのBeanをアプリケーションで使用する準備ができており、Runnerインターフェイスのrunメソッドを実行する準備ができていることを示しています。

runメソッドの実行が完了するか、ApplicationContextイベントが失敗すると、TaskRepositoryは別のエントリで更新されます。

During the task life-cycle, we can register listeners available from TaskExecutionListener interface。 タスクのそれぞれのイベントでトリガーされるonTaskEndonTaksFailed、およびonTaskStartupの3つのメソッドを持つインターフェイスを実装するクラスが必要です。

TaskDemoクラスで実装クラスのBeanを宣言する必要があります。

@Bean
public TaskListener taskListener() {
    return new TaskListener();
}

4. SpringBatchとの統合

Spring Cloud Jobを使用して、Spring Batch Jobをタスクとして実行し、ジョブ実行のイベントを記録できます。 この機能を有効にするには、ブートとクラウドに関連するバッチ依存関係を追加する必要があります。


    org.springframework.boot
    spring-boot-starter-batch


    org.springframework.cloud
    spring-cloud-task-batch

Hereは、spring-cloud-task-batchのMavenCentralへのリンクです。

ジョブをタスクとして構成するには、ジョブBeanをJobConfigurationクラスに登録する必要があります。

@Bean
public Job job2() {
    return jobBuilderFactory.get("job2")
      .start(stepBuilderFactory.get("job2step1")
      .tasklet(new Tasklet(){
          @Override
          public RepeatStatus execute(
            StepContribution contribution,
            ChunkContext chunkContext) throws Exception {
            System.out.println("This job is from example");
                return RepeatStatus.FINISHED;
          }
    }).build()).build();
}

We need to decorate the TaskDemo class with @EnableBatchProcessing annotation

//..Other Annotation..
@EnableBatchProcessing
public class TaskDemo {
    // ...
}

@EnableBatchProcessingアノテーションは、バッチジョブのセットアップに必要な基本構成でSpringBatch機能を有効にします。

これで、アプリケーションを実行すると、@EnableBatchProcessingアノテーションがSpring Batch Jobの実行をトリガーし、Spring Cloud Taskがすべてのバッチジョブの実行イベントを、springcloudデータベースで実行された他のタスクとともにログに記録します。 。

5. ストリームからタスクを起動する

Spring Cloud Streamからタスクをトリガーできます。 この目的を果たすために、@EnableTaskLaucnherアノテーションがあります。 Spring Bootアプリで注釈を追加すると、TaskSinkが利用可能になります。

@SpringBootApplication
@EnableTaskLauncher
public class StreamTaskSinkApplication {
    public static void main(String[] args) {
        SpringApplication.run(TaskSinkApplication.class, args);
    }
}

TaskSinkは、ペイロードとしてTaskLaunchRequestを含むGenericMessageを含むストリームからメッセージを受信します。 次に、タスク起動要求で提供された座標に基づいてタスクベースをトリガーします。

To have TaskSink functional, we require a bean configured that implements TaskLauncher interface。 テストの目的で、ここで実装をモックします。

@Bean
public TaskLauncher taskLauncher() {
    return mock(TaskLauncher.class);
}

ここで、TaskLauncherインターフェースは、spring-cloud-deployer-local依存関係を追加した後にのみ使用可能になることに注意する必要があります。


    org.springframework.cloud
    spring-cloud-deployer-local
    1.3.1.RELEASE

Sinkインターフェースのinputを呼び出すことにより、タスクが起動したかどうかをテストできます。

public class StreamTaskSinkApplicationTests {

    @Autowired
    private Sink sink;

    //
}

ここで、TaskLaunchRequestのインスタンスを作成し、それをGenericMessage<TaskLaunchRequest>オブジェクトのペイロードとして送信します。 次に、GenericMessageオブジェクトをチャネルに保持したまま、Sinkinputチャネルを呼び出すことができます。

6. 結論

このチュートリアルでは、Spring Cloud Taskがどのように実行されるか、およびデータベースにイベントを記録するようにタスクを構成する方法について説明しました。 また、Spring Batchジョブがどのように定義されてTaskRepositoryに格納されるかを観察しました。 最後に、Spring Cloud Stream内からTaskをトリガーする方法を説明しました。

いつものように、コードはover on GitHubで利用できます。