1概要

  • Spring Cloud Taskの目的は、Spring Bootアプリケーション用に寿命の短いマイクロサービスを作成する機能を提供することです。

Spring Cloud Taskでは、任意のタスクを動的に実行し、要求に応じてリソースを割り当て、タスク完了後に結果を取得するという柔軟性を得ました。

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


2簡単な仕事用アプリケーションの開発

** 2.1. 関連する依存関係を追加する

はじめに、__spring-cloud-task-dependenciesという依存関係管理セクションを追加することができます。

<dependencyManagement>
    <dependencies>
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-task-dependencies</artifactId>
            <version>1.2.2.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>


この

はMaven Centralへの

spring-cloud-task-core

のリンクです。

さて、Spring Bootアプリケーションを起動するには、関連する親と一緒に

spring-boot-starter

が必要です。

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

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

Spring Data JPAを使った簡単なSpring Bootアプリケーションのブートストラップの詳細はリンク:/spring-boot-start[ここ]をご覧ください。

私たちは

spring-boot-starter-parent

o

__n

__の最新版をチェックすることができます。中央]。


2.2.

@ EnableTask

アノテーション

Spring Cloudタスクの機能をブートストラップするには、

@ EnableTask

アノテーションを追加する必要があります。

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

  • アノテーションは

    SimpleTaskConfiguration

    クラスを画面に持ってきて、順番に

    TaskRepository

    とそのインフラストラクチャを登録します** 。

デフォルトでは、インメモリマップは

TaskRepository

のステータスを格納するために使用されます。


TaskRepository

の主な情報は、

TaskExecution

クラスでモデル化されています。このクラスの注目のフィールドは、

taskName



startTime



endTime

、および

exitMessage

です。

exitMessage

は、終了時に利用可能な情報を格納します。

アプリケーションのいずれかのイベントで失敗が原因で終了が発生した場合、完全な例外スタックトレースがここに格納されます。

Spring Bootは

ExitCodeExceptionMapper

インターフェースを提供します。これは捕捉されていない例外を精査されたデバッグを可能にする終了コードにマッピングします。クラウドタスクは、将来の分析のために情報をデータソースに格納します。


2.3.

TaskRepository




DataSource

の設定

タスクが終了すると、

TaskRepository

を格納するためのメモリ内マップが消え、タスクイベントに関連するデータが失われます。恒久的なストレージに保存するために、Spring Data JPAではデータソースとして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

アノテーションを付け、そのインスタンスを上記で定義した

HelloWorldTaskConfigurer

Beanのコンストラクタ引数としてインジェクトする必要があります。

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

これで、

TaskRepository

をMySQLデータベースに格納するための設定が完了しました。


2.4. 実装

Spring Bootでは、アプリケーションが起動を終了する直前に任意のタスクを実行できます。

これらのインタフェースの

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 Spring Cloudタスクのライフサイクル

はじめに、

TaskRepository

にエントリを作成します。これは、すべてのBeanがアプリケーションで使用される準備が整い、Runnerインタフェースの

run

メソッドが実行される準備ができていることを示しています。


run

メソッドの実行が完了すると、または

ApplicationContext

イベントが失敗すると、

TaskRepository

が別のエントリで更新されます。

  • タスクのライフサイクル中に、

    TaskExecutionListener

    インターフェースから利用可能なリスナーを登録することができます** 。タスクの各イベントでトリガされる

    onTaskEnd



    onTaksFailed

    、および

    onTaskStartup

    の3つのメソッドを持つインターフェイスを実装するクラスが必要です。

実装クラスのBeanを

TaskDemo

クラスで宣言する必要があります。

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


4 Spring Batchとの統合

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

<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>


こちら

はMaven Centralへの

spring-cloud-task-batch

のリンクです。

ジョブをタスクとして設定するには、Job 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

アノテーションは、バッチジョブを設定するために必要な基本設定でSpring Batch機能を有効にします。

アプリケーションを実行すると、

@ EnableBatchProcessing

アノテーションがSpring Batch Jobの実行をトリガーし、Spring Cloud Taskが

springcloud

データベースで実行された他のTaskと共にすべてのバッチジョブの実行のイベントを記録します。


5 Streamからタスクを起動する

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

を含むストリームからメッセージを受け取ります。それから、タスク起動要求で提供された座標に基づいてタスクベースを起動します。


  • TaskSink

    を機能させるには、

    TaskLauncher

    インターフェース** を実装するように設定されたBeanが必要です。テスト目的で、ここで実装をモックしています。

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


  • TaskLauncher

    インターフェースはhttps://search.maven.org/classic/#search%7Cga%7C1%7Ca%3A%22spring-cloud-deployer-local%22[

    springを追加した後にのみ利用可能であることに注意する必要があります。 -cloud-deployer-local

    ]依存関係:**

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


Sink

インターフェースの

input

を呼び出すことでタスクが起動したかどうかをテストできます。

public class StreamTaskSinkApplicationTests {

    @Autowired
    private Sink sink;

   //}

それでは、

TaskLaunchRequest

のインスタンスを作成し、それを

GenericMessage <>

オブジェクトのペイロードとして送信します。その後、

GenericMessage

オブジェクトをチャネル内に保持したまま、

Sink



input

チャネルを呼び出すことができます。


6. 結論

このチュートリアルでは、Spring Cloud Taskがどのように機能するか、およびイベントをデータベースに記録するように設定する方法について説明しました。 Spring Batchジョブがどのように定義され

TaskRepository

に格納されているかも観察しました。最後に、Spring Cloud Stream内からタスクをトリガーする方法について説明しました。

いつものように、コードはhttps://github.com/eugenp/tutorials/tree/master/spring-cloud/spring-cloud-task[GitHubで利用可能]で利用可能です。