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クラスでモデル化されます。 このクラスの注記されているフィールドは、taskName、startTime、endTime、exitMessageです。 exitMessageは、終了時に利用可能な情報を格納します。
アプリケーションのいずれかのイベントの失敗が出口の原因である場合、完全な例外スタックトレースがここに保存されます。
Spring Boot provides an interface ExitCodeExceptionMapper which maps uncaught exceptions to exit codes allowing scrutinized debug。 Cloud Taskは、将来の分析のために情報をデータソースに保存します。
2.3. TaskRepositoryのDataSourceの構成
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。 タスクのそれぞれのイベントでトリガーされるonTaskEnd、onTaksFailed、および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オブジェクトをチャネルに保持したまま、Sinkのinputチャネルを呼び出すことができます。
6. 結論
このチュートリアルでは、Spring Cloud Taskがどのように実行されるか、およびデータベースにイベントを記録するようにタスクを構成する方法について説明しました。 また、Spring Batchジョブがどのように定義されてTaskRepositoryに格納されるかを観察しました。 最後に、Spring Cloud Stream内からTaskをトリガーする方法を説明しました。
いつものように、コードはover on GitHubで利用できます。