1. 概要

Spring Cloud Taskの目標は、SpringBootアプリケーション用の短期間のマイクロサービスを作成する機能を提供することです

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

Tasksは、Spring Cloud Data Flow内の新しいプリミティブであり、ユーザーは事実上すべてのSpringBootアプリケーションを短期間のタスクとして実行できます

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

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

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

<dependencyManagement>
    <dependencies>
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-task-dependencies</artifactId>
            <version>2.2.3.RELEASE</version>
            <type>pom</type>
            <scope>import</scope>
        </dependency>
    </dependencies>
</dependencyManagement>

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

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

<dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-starter-task</artifactId>
</dependency>
<dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-task-core</artifactId>
</dependency>

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

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

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

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-data-jpa</artifactId>
    <version>2.6.1</version>
</dependency>

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

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

2.2. @EnableTaskアノテーション

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

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

アノテーションにより、画像にSimpleTaskConfigurationクラスが追加され、TaskRepositoryとそのインフラストラクチャが登録されます。 デフォルトでは、TaskRepositoryのステータスを保存するためにメモリ内マップが使用されます。

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

アプリケーションのいずれかのイベントで障害が発生したために終了した場合は、完全な例外スタックトレースがここに保存されます。

Spring Bootは、キャッチされなかった例外を終了コードにマップするインターフェイスExitCodeExceptionMapperを提供し、精査されたデバッグを可能にします。 クラウドタスクは、将来の分析のために情報をデータソースに保存します。

2.3. TaskRepositoryDataSourceの構成

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

データソースはapplication.ymlファイルで構成されます。 提供されたデータソースをTaskRepositoryのストレージとして使用するようにSpringCloudTaskを構成するには、extends 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では、アプリケーションの起動が完了する直前に任意のタスクを実行できます。 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は別のエントリで更新されます。

タスクのライフサイクル中に、TaskExecutionListenerインターフェースから利用可能なリスナーを登録できます。 タスクのそれぞれのイベントでトリガーされるonTaskEnd onTaksFailed onTaskStartupの3つのメソッドを持つインターフェイスを実装するクラスが必要です。

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

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

4. SpringBatchとの統合

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

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

ここは、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 Baeldung");
                return RepeatStatus.FINISHED;
          }
    }).build()).build();
}

TaskDemoクラスを@EnableBatchProcessingアノテーションで装飾する必要があります

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

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

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

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

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

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

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

TaskSinkを機能させるには、TaskLauncherインターフェースを実装するBeanを構成する必要があります。 テストの目的で、ここで実装をモックアップしています。

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

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

<dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-deployer-local</artifactId>
    <version>2.3.1.RELEASE</version>
</dependency>

シンクインターフェイスの入力を呼び出すことで、タスクが起動したかどうかをテストできます。

public class StreamTaskSinkApplicationTests {
   
    @Autowired
    private Sink sink; 
    
    //
}

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

6. 結論

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

いつものように、コードはGitHubから入手できます。