バージョン 3.0.4
© 2009-2022 VMware, Inc. All rights reserved.
このドキュメントのコピーは、あなた自身の使用および他者への配布のために作成することができますが、そのようなコピーに料金を請求しないこと、さらに、印刷物または電子的に配布されるかどうかにかかわらず、各コピーにこの著作権表示が含まれていることを条件とします。
序文
1. ドキュメントについて
Spring Cloud Task リファレンスガイドは、html、pdf (英語) 、epub で入手できます。最新版は docs.spring.io/spring-cloud-task/docs/current-SNAPSHOT/reference/html/ で入手できます。
このドキュメントのコピーは、あなた自身の使用および他者への配布のために作成することができますが、そのようなコピーに料金を請求しないこと、さらに、印刷物または電子的に配布されるかどうかにかかわらず、各コピーにこの著作権表示が含まれていることを条件とします。
2. ヘルプの利用
Spring Cloud Task に問題がありますか? お手伝いします!
質問します。
spring-cloud-task
(英語) でタグ付けされた質問の stackoverflow.com (英語) を監視します。github.com/spring-cloud/spring-cloud-task/issues (英語) で Spring Cloud Task のバグを報告してください。
Spring Cloud Task はドキュメントも含めてすべてオープンソースです。ドキュメントに問題を見つけた場合、または単にドキュメントを改善したい場合は、参加してください [GitHub] (英語) 。 |
3. ファーストステップ
Spring Cloud Task または "Spring" 全般を始めたばかりの場合は、入門の章を読むことをお勧めします。
最初から始めるには、次のセクションを参照してください。
チュートリアルに従うには、初めての Spring Cloud Task アプリケーションの開発を参照してください。
例を実行するには、サンプルの実行を参照してください。
入門
Spring Cloud Task を始めたばかりの場合は、このセクションを参照してください。ここでは、基本的な「何を ? 」「どのように ? 」「なぜ ? 」に回答します。質問。Spring Cloud Task についての穏やかな導入から始めます。次に、いくつかの核となる原則について話し合いながら、Spring Cloud Task アプリケーションを構築します。
4. Spring Cloud Task の導入
Spring Cloud Task を使用すると、存続期間の短いマイクロサービスを簡単に作成できます。有効期間の短い JVM プロセスを本番環境でオンデマンドで実行できる機能を提供します。
5. システム要件
Java がインストールされている必要があります (Java 17 以降)。ビルドするには、Maven もインストールする必要があります。
5.1. データベース要件
Spring Cloud Task は、リレーショナルデータベースを使用して、実行されたタスクの結果を保存します。データベースがなくてもタスクの開発を開始できますが (タスクのステータスはタスクリポジトリの更新の一部としてログに記録されます)、運用環境では、サポートされているデータベースを使用する必要があります。Spring Cloud Task は現在、次のデータベースをサポートしています。
DB2
H2
HSQLDB
MySql
Oracle
Postgres
SqlServer
6. 初めての Spring Cloud Task アプリケーションの開発
始めるには、シンプルな "Hello, World!" アプリケーションから始めるのが良いでしょう。そこで、フレームワークの機能を強調するために、Spring Cloud Task と同等のアプリケーションを作成します。ほとんどの IDE は Apache Maven を適切にサポートしているため、このプロジェクトのビルドツールとして使用します。
spring.io Web サイトには、Spring Boot を使用する "Getting Started " ガイドが多数含まれています。特定の問題を解決する必要がある場合は、まずそこを確認してください。Spring Initializr に移動して新しいプロジェクトを作成すると、次の手順を短縮できます。これにより、新しいプロジェクト構造が自動的に生成されるため、すぐにコーディングを開始できます。Spring Initializr に慣れるために、試してみることをお勧めします。 |
6.1. Spring Initializr を使用した Spring タスクプロジェクトの作成
これで、Hello, World!
をコンソールに出力するアプリケーションを作成してテストできるようになりました。
そうするために:
Spring イニシャル zr サイトにアクセスしてください。
グループ名が
io.spring.demo
、成果物名がhelloworld
の新しい Maven プロジェクトを作成します。依存関係 テキストボックスに "
task
" と入力し、Cloud Task
依存関係を選択します。依存関係 テキストボックスに "
jdbc
" と入力し、JDBC
依存関係を選択します。依存関係 テキストボックスに
h2
と入力し、H2
を選択します。(またはお気に入りのデータベース)"プロジェクトを生成する " ボタンをクリックします
helloworld.zip ファイルを解凍し、プロジェクトをお気に入りの IDE にインポートします。
6.2. コードの作成
アプリケーションを完成するには、タスクを起動できるように、生成された HelloworldApplication
を次の内容で更新する必要があります。
package io.spring.Helloworld;
@SpringBootApplication
@EnableTask
public class HelloworldApplication {
@Bean
public ApplicationRunner applicationRunner() {
return new HelloWorldApplicationRunner();
}
public static void main(String[] args) {
SpringApplication.run(HelloworldApplication.class, args);
}
public static class HelloWorldApplicationRunner implements ApplicationRunner {
@Override
public void run(ApplicationArguments args) throws Exception {
System.out.println("Hello, World!");
}
}
}
小さいように見えるかもしれませんが、かなりのことが起こっています。Spring Boot の詳細については、"Spring Boot リファレンスドキュメント" を参照してください。
これで、src/main/resources
で application.properties
ファイルを開くことができます。application.properties
で 2 つのプロパティを設定する必要があります。
application.name
: アプリケーション名を設定するには (これはタスク名に変換されます)logging.level
: 何が起こっているかを把握するために、Spring Cloud Task のログをDEBUG
に設定します。
次の例は、両方を行う方法を示しています。
logging.level.org.springframework.cloud.task=DEBUG
spring.application.name=helloWorld
6.2.1. タスクの自動構成
Spring Cloud Task Starter 依存関係を含めると、タスクはすべての Bean がその機能をブートストラップするように自動構成します。この構成の一部では、TaskRepository
とその使用のためのインフラストラクチャを登録します。
デモでは、TaskRepository
は組み込みの H2 データベースを使用してタスクの結果を記録します。H2 DB はタスクが終了すると消滅するため、この H2 組み込みデータベースは運用環境にとって実用的なソリューションではありません。ただし、簡単に開始するために、この例でこれを使用するだけでなく、そのリポジトリで更新されている内容をログにエコーすることもできます。構成セクション (このドキュメントの後半) では、Spring Cloud Task によって提供される要素の構成をカスタマイズする方法について説明します。
サンプルアプリケーションが実行されると、Spring Boot は HelloWorldCommandLineRunner
を起動し、"Hello, World!" を出力します。標準出力へのメッセージ。TaskLifecycleListener
は、タスクの開始と終了をリポジトリに記録します。
6.2.2. 主なメソッド
main メソッドは、java アプリケーションへのエントリポイントとして機能します。私たちのメインメソッドは Spring Boot の SpringApplication クラスにデリゲートします。
6.2.3. ApplicationRunner
Spring には、アプリケーションのロジックをブートストラップするための多くの方法が含まれています。Spring Boot は、*Runner
インターフェース (CommandLineRunner
または ApplicationRunner
) を通じて、組織的な方法でこれを行うための便利な方法を提供します。適切に動作するタスクは、これら 2 つのランナーのいずれかを使用して任意のロジックをブートストラップできます。
タスクのライフサイクルは、*Runner#run
メソッドが実行される前から、すべてのメソッドが完了するまで考慮されます。Spring Boot では、Spring Cloud Task と同様に、アプリケーションで複数の *Runner
実装を使用できます。
CommandLineRunner または ApplicationRunner 以外のメカニズムから (たとえば InitializingBean#afterPropertiesSet を使用して) ブートストラップされた処理は、Spring Cloud Task によって記録されません。 |
6.3. サンプルの実行
この時点で、アプリケーションは動作するはずです。このアプリケーションは Spring Boot ベースであるため、次の例 (その出力とともに) に示すように、アプリケーションのルートから $ mvn spring-boot:run
を使用してコマンドラインから実行できます。
$ mvn clean spring-boot:run
....... . . .
....... . . . (Maven log output here)
....... . . .
. ____ _ __ _ _
/\\ / ___'_ __ _ _(_)_ __ __ _ \ \ \ \
( ( )\___ | '_ | '_| | '_ \/ _` | \ \ \ \
\\/ ___)| |_)| | | | | || (_| | ) ) ) )
' |____| .__|_| |_|_| |_\__, | / / / /
=========|_|==============|___/=/_/_/_/
:: Spring Boot :: (v2.0.3.RELEASE)
2018-07-23 17:44:34.426 INFO 1978 --- [ main] i.s.d.helloworld.HelloworldApplication : Starting HelloworldApplication on Glenns-MBP-2.attlocal.net with PID 1978 (/Users/glennrenfro/project/helloworld/target/classes started by glennrenfro in /Users/glennrenfro/project/helloworld)
2018-07-23 17:44:34.430 INFO 1978 --- [ main] i.s.d.helloworld.HelloworldApplication : No active profile set, falling back to default profiles: default
2018-07-23 17:44:34.472 INFO 1978 --- [ main] s.c.a.AnnotationConfigApplicationContext : Refreshing org.springframework.context.annotation.AnnotationConfigApplicationContext@1d24f32d: startup date [Mon Jul 23 17:44:34 EDT 2018]; root of context hierarchy
2018-07-23 17:44:35.280 INFO 1978 --- [ main] com.zaxxer.hikari.HikariDataSource : HikariPool-1 - Starting...
2018-07-23 17:44:35.410 INFO 1978 --- [ main] com.zaxxer.hikari.HikariDataSource : HikariPool-1 - Start completed.
2018-07-23 17:44:35.419 DEBUG 1978 --- [ main] o.s.c.t.c.SimpleTaskConfiguration : Using org.springframework.cloud.task.configuration.DefaultTaskConfigurer TaskConfigurer
2018-07-23 17:44:35.420 DEBUG 1978 --- [ main] o.s.c.t.c.DefaultTaskConfigurer : No EntityManager was found, using DataSourceTransactionManager
2018-07-23 17:44:35.522 DEBUG 1978 --- [ main] o.s.c.t.r.s.TaskRepositoryInitializer : Initializing task schema for h2 database
2018-07-23 17:44:35.525 INFO 1978 --- [ main] o.s.jdbc.datasource.init.ScriptUtils : Executing SQL script from class path resource [org/springframework/cloud/task/schema-h2.sql]
2018-07-23 17:44:35.558 INFO 1978 --- [ main] o.s.jdbc.datasource.init.ScriptUtils : Executed SQL script from class path resource [org/springframework/cloud/task/schema-h2.sql] in 33 ms.
2018-07-23 17:44:35.728 INFO 1978 --- [ main] o.s.j.e.a.AnnotationMBeanExporter : Registering beans for JMX exposure on startup
2018-07-23 17:44:35.730 INFO 1978 --- [ main] o.s.j.e.a.AnnotationMBeanExporter : Bean with name 'dataSource' has been autodetected for JMX exposure
2018-07-23 17:44:35.733 INFO 1978 --- [ main] o.s.j.e.a.AnnotationMBeanExporter : Located MBean 'dataSource': registering with JMX server as MBean [com.zaxxer.hikari:name=dataSource,type=HikariDataSource]
2018-07-23 17:44:35.738 INFO 1978 --- [ main] o.s.c.support.DefaultLifecycleProcessor : Starting beans in phase 0
2018-07-23 17:44:35.762 DEBUG 1978 --- [ main] o.s.c.t.r.support.SimpleTaskRepository : Creating: TaskExecution{executionId=0, parentExecutionId=null, exitCode=null, taskName='application', startTime=Mon Jul 23 17:44:35 EDT 2018, endTime=null, exitMessage='null', externalExecutionId='null', errorMessage='null', arguments=[]}
2018-07-23 17:44:35.772 INFO 1978 --- [ main] i.s.d.helloworld.HelloworldApplication : Started HelloworldApplication in 1.625 seconds (JVM running for 4.764)
Hello, World!
2018-07-23 17:44:35.782 DEBUG 1978 --- [ main] o.s.c.t.r.support.SimpleTaskRepository : Updating: TaskExecution with executionId=1 with the following {exitCode=0, endTime=Mon Jul 23 17:44:35 EDT 2018, exitMessage='null', errorMessage='null'}
前述の出力には、ここで興味深い 3 行があります。
SimpleTaskRepository
は、エントリの作成をTaskRepository
に記録しました。"Hello, World!" によって示される
CommandLineRunner
の実行。出力。SimpleTaskRepository
はタスクの完了をTaskRepository
に記録します。
簡単なタスクアプリケーションは、ここの Spring Cloud Task プロジェクトのサンプルモジュールにあります。 |
機能
このセクションでは、Spring Cloud Task の使用方法、設定方法、適切な拡張ポイントなど、Spring Cloud Task について詳しく説明します。
7. Spring Cloud Task のライフサイクル
ほとんどの場合、最新のクラウド環境は、終了が予想されないプロセスの実行を中心に設計されています。終了した場合、通常は再起動されます。ほとんどのプラットフォームには、終了時に再起動されないプロセスを実行する何らかの方法がありますが、通常、その実行結果は消耗的な方法で維持されません。Spring Cloud Task は、環境内で短期間のプロセスを実行し、結果を記録する機能を提供します。そうすることで、メッセージによるタスクの統合を通じて、存続期間の短いプロセスだけでなく、長時間実行されるサービスを中心としたマイクロサービスアーキテクチャが可能になります。
この機能はクラウド環境では便利ですが、従来の デプロイモデルでも同じ問題が発生する可能性があります。cron などのスケジューラーを使用して Spring Boot アプリケーションを実行する場合、完了後にアプリケーションの結果を監視できると便利です。
Spring Cloud Task は、Spring Boot アプリケーションが開始と終了を持ちながらも成功できるというアプローチを採用しています。バッチアプリケーションは、終了が予想されるプロセス (多くの場合、有効期間が短い) がどのように役立つかを示す 1 つの例です。
Spring Cloud Task は、特定のタスクのライフサイクルイベントを記録します。ほとんどの Web アプリケーションに代表される、長時間実行プロセスのほとんどは、ライフサイクルイベントを保存しません。Spring Cloud Task の中心となるタスクはこれを実行します。
ライフサイクルは単一のタスクの実行で構成されます。これは、タスクとして構成された Spring Boot アプリケーションの物理的な実行です (つまり、Sprint Cloud タスクの依存関係があります)。
タスクの開始時、CommandLineRunner
または ApplicationRunner
実装が実行される前に、開始イベントを記録する TaskRepository
内のエントリが作成されます。このイベントは、Spring Framework によってトリガーされる SmartLifecycle#start
によってトリガーされます。これは、すべての Bean が使用できる状態にあり、Spring Boot によって提供される CommandLineRunner
または ApplicationRunner
実装を実行する前に行われることをシステムに示します。
タスクの記録は、ApplicationContext のブートストラップが成功した場合にのみ行われます。コンテキストがブートストラップにまったく失敗した場合、タスクの実行は記録されません。 |
Spring Boot からの *Runner#run
呼び出しがすべて完了するか、ApplicationContext
が失敗する ( ApplicationFailedEvent
によって示される) と、タスクの実行が結果とともにリポジトリ内で更新されます。
アプリケーションがタスクの完了時に ApplicationContext を閉じる必要がある場合 (すべての *Runner#run メソッドが呼び出され、タスクリポジトリが更新されている場合)、プロパティ spring.cloud.task.closecontextEnabled を true に設定します。 |
7.1. TaskExecution
TaskRepository
に格納される情報は TaskExecution
クラスでモデル化され、次の情報で構成されます。
フィールド | 説明 |
---|---|
| タスクの実行の一意の ID。 |
|
|
| 構成された |
|
|
|
|
| 退出時に入手可能な情報。これは、 |
| 例外がタスク終了の原因である場合 ( |
| 実行可能 Boot アプリケーションに渡された文字列コマンドライン引数の |
7.2. 終了コードのマッピング
タスクが完了すると、OS に終了コードを返そうとします。元の例を見ると、アプリケーションのその側面を制御していないことがわかります。例外がスローされた場合、JVM はデバッグに役立つかどうかわからないコードを返します。
そのため、Spring Boot は、キャッチされなかった例外を終了コードにマップできるインターフェース ExitCodeExceptionMapper
を提供します。そうすることで、何が問題だったのかを終了コードのレベルで示すことができます。また、この方法で終了コードをマッピングすることにより、Spring Cloud Task は返された終了コードを記録します。
タスクが SIG-INT または SIG-TERM で終了する場合、コード内で特に指定されていない限り、終了コードは 0 です。
タスクの実行中、終了コードはリポジトリに null として保存されます。タスクが完了すると、このセクションで前述したガイドラインに基づいて、適切な終了コードが保存されます。 |
8. 構成
Spring Cloud Task は、DefaultTaskConfigurer
クラスおよび SimpleTaskConfiguration
クラスで定義されているように、すぐに使用できる構成を提供します。このセクションでは、デフォルト設定と、ニーズに合わせて Spring Cloud Task をカスタマイズする方法について説明します。
8.1. データソース
Spring Cloud Task は、タスクの実行結果を保存するためにデータソースを使用します。デフォルトでは、H2 のメモリ内インスタンスを提供して、ブートストラップ開発の簡単な方法を提供します。ただし、本番環境では、おそらく独自の DataSource
を構成する必要があるでしょう。
アプリケーションが単一の DataSource
のみを使用し、それがビジネススキーマとタスクリポジトリの両方として機能する場合、必要なのは DataSource
を提供することだけです (これを行う最も簡単な方法は、Spring Boot の構成規則を使用することです)。この DataSource
は、Spring Cloud Task によってリポジトリとして自動的に使用されます。
アプリケーションが複数の DataSource
を使用する場合は、適切な DataSource
を使用してタスクリポジトリを構成する必要があります。このカスタマイズは、TaskConfigurer
の実装を通じて実行できます。
8.2. テーブルプレフィックス
TaskRepository
の変更可能なプロパティの 1 つは、タスクテーブルのテーブルプレフィックスです。デフォルトでは、すべての先頭に TASK_
が付きます。TASK_EXECUTION
と TASK_EXECUTION_PARAMS
が 2 つの例です。ただし、このプレフィックスを変更する潜在的な理由があります。スキーマ名をテーブル名の先頭に追加する必要がある場合、または同じスキーマ内に複数のタスクテーブルのセットが必要な場合は、テーブルのプレフィックスを変更する必要があります。これを行うには、次のように spring.cloud.task.tablePrefix
を必要なプレフィックスに設定します。
spring.cloud.task.tablePrefix=yourPrefix
spring.cloud.task.tablePrefix
を使用することにより、ユーザーは、タスクテーブルスキーマの条件を満たし、かつユーザーのビジネスニーズに必要な変更を加えたタスクテーブルを作成する責任を負います。ここに示すように、独自のタスク DDL を作成するときのガイドとして Spring Cloud Task スキーマ DDL を利用できます。
8.3. テーブルの初期化を有効 / 無効にする
タスクテーブルを作成していて、タスクの開始時に Spring Cloud Task にタスクテーブルを作成させたくない場合は、次のように spring.cloud.task.initialize-enabled
プロパティを false
に設定します。
spring.cloud.task.initialize-enabled=false
デフォルトは true
です。
プロパティ spring.cloud.task.initialize.enable は非推奨になりました。 |
8.4. 外部で生成されたタスク ID
場合によっては、タスクがリクエストされたときと、インフラストラクチャが実際にタスクを起動するときとの間の時間差を考慮したい場合があります。Spring Cloud Task を使用すると、タスクがリクエストされたときに TaskExecution
を作成できます。次に、生成された TaskExecution
の実行 ID をタスクに渡し、タスクのライフサイクルを通じて TaskExecution
を更新できるようにします。
TaskExecution
は、TaskExecution
オブジェクトを保持するデータストアを参照する TaskRepository
の実装で createTaskExecution
メソッドを呼び出すことによって作成できます。
生成された TaskExecutionId
を使用するようにタスクを構成するには、次のプロパティを追加します。
spring.cloud.task.executionid=yourtaskId
8.5. 外部タスク ID
Spring Cloud Task を使用すると、各 TaskExecution
の外部タスク ID を保存できます。生成された TaskExecutionId
を使用するようにタスクを構成するには、次のプロパティを追加します。
spring.cloud.task.external-execution-id=<externalTaskId>
8.6. 親タスク ID
Spring Cloud Task を使用すると、各 TaskExecution
の親タスク ID を保存できます。この例としては、別のタスクを実行するタスクがあり、どのタスクが各子タスクを起動したかを記録したい場合があります。親 TaskExecutionId
を設定するようにタスクを構成するには、子タスクに次のプロパティを追加します。
spring.cloud.task.parent-execution-id=<parentExecutionTaskId>
8.7. TaskConfigurer
TaskConfigurer
は、Spring Cloud Task のコンポーネントの構成方法をカスタマイズできる戦略インターフェースです。デフォルトでは、論理デフォルトを提供する DefaultTaskConfigurer
が提供されます。Map
ベースのメモリ内コンポーネント (DataSource
が提供されない場合に開発に役立ちます) および JDBC ベースのコンポーネント (DataSource
が利用可能な場合に役立ちます)。
TaskConfigurer
では、次の 3 つの主要コンポーネントを構成できます。
コンポーネント | 説明 | デフォルト (DefaultTaskConfigurer によって提供されました) |
---|---|---|
| 使用する |
|
| 使用される |
|
| タスクの更新を実行するときに使用されるトランザクションマネージャー。 |
|
You can customize any of the components described in the preceding table by creating a
custom implementation of the TaskConfigurer
interface. Typically, extending the
DefaultTaskConfigurer
(which is provided if a TaskConfigurer
is not found) and
overriding the required getter is sufficient. However, implementing your own from scratch
may be required.
Users should not directly use getter methods from a TaskConfigurer directly
unless they are using it to supply implementations to be exposed as Spring Beans.
|
8.8. Task Execution Listener
TaskExecutionListener
lets you register listeners for specific events that occur during
the task lifecycle. To do so, create a class that implements the
TaskExecutionListener
interface. The class that implements the TaskExecutionListener
interface is notified of the following events:
-
onTaskStartup
: Prior to storing theTaskExecution
into theTaskRepository
. -
onTaskEnd
: Prior to updating theTaskExecution
entry in theTaskRepository
and marking the final state of the task. -
onTaskFailed
: Prior to theonTaskEnd
method being invoked when an unhandled exception is thrown by the task.
Spring Cloud Task also lets you add TaskExecution
Listeners to methods within a bean
by using the following method annotations:
-
@BeforeTask
: Prior to the storing theTaskExecution
into theTaskRepository
@AfterTask
: タスクの最終状態をマークするTaskRepository
内のTaskExecution
エントリを更新する前。@FailedTask
: 未処理の例外がタスクによってスローされたときに@AfterTask
メソッドが呼び出される前。
次の例は、使用されている 3 つのアノテーションを示しています。
public class MyBean {
@BeforeTask
public void methodA(TaskExecution taskExecution) {
}
@AfterTask
public void methodB(TaskExecution taskExecution) {
}
@FailedTask
public void methodC(TaskExecution taskExecution, Throwable throwable) {
}
}
TaskLifecycleListener が存在する前に ApplicationListener を チェーンに挿入すると、予期しない影響が生じる可能性があります。 |
8.8.1. タスク実行リスナーによってスローされる例外
TaskExecutionListener
イベントハンドラーによって例外がスローされた場合、そのイベントハンドラーのすべてのリスナー処理が停止します。例: 3 つの onTaskStartup
リスナーが開始され、最初の onTaskStartup
イベントハンドラーが例外をスローした場合、他の 2 つの onTaskStartup
メソッドは呼び出されません。ただし、TaskExecutionListeners
の他のイベントハンドラー (onTaskEnd
および onTaskFailed
) が呼び出されます。
TaskExecutionListener
イベントハンドラーによって例外がスローされたときに返される終了コードは、ExitCodeEvent (Javadoc) によって報告された終了コードです。ExitCodeEvent
が発行されない場合、スローされた例外が評価されて、型が ExitCodeGenerator であるかどうかが確認されます。存在する場合は、ExitCodeGenerator
から終了コードを返します。それ以外の場合は、1
が返されます。
onTaskStartup
メソッドで例外がスローされた場合、アプリケーションの終了コードは 1
になります。onTaskEnd
または onTaskFailed
メソッドで例外がスローされた場合、アプリケーションの終了コードは、上で列挙したルールを使用して確立されたコードになります。
onTaskStartup 、onTaskEnd 、または onTaskFailed で例外がスローされた場合、ExitCodeExceptionMapper を使用してアプリケーションの終了コードをオーバーライドすることはできません。 |
8.8.2. 終了メッセージ
TaskExecutionListener
を使用すると、タスクの終了メッセージをプログラムで設定できます。これは、TaskExecution’s
exitMessage
を設定することによって行われ、その後 TaskExecutionListener
に渡されます。次の例は、@AfterTask
ExecutionListener
のアノテーションが付けられたメソッドを示しています。
@AfterTask
public void afterMe(TaskExecution taskExecution) {
taskExecution.setExitMessage("AFTER EXIT MESSAGE");
}
ExitMessage
は、リスナーイベント (onTaskStartup
、onTaskFailed
、onTaskEnd
) のいずれかで設定できます。3 つのリスナーの優先順位は次のとおりです。
onTaskEnd
onTaskFailed
onTaskStartup
例: onTaskStartup
および onTaskFailed
リスナーに exitMessage
を設定し、タスクが失敗せずに終了した場合、onTaskStartup
からの exitMessage
がリポジトリに保存されます。それ以外の場合、障害が発生すると、onTaskFailed
から exitMessage
が格納されます。また、onTaskEnd
リスナーを使用して exitMessage
を設定した場合、onTaskEnd
の exitMessage
が、onTaskStartup
と onTaskFailed
の両方からの終了メッセージよりも優先されます。
8.9. Spring Cloud Task インスタンスの制限
Spring Cloud Task を使用すると、特定のタスク名を持つタスクを一度に 1 つだけ実行できるように設定できます。そのためには、タスク名を設定し、各タスク実行に対して spring.cloud.task.single-instance-enabled=true
を設定する必要があります。最初のタスク実行の実行中に、同じタスク名と `spring.cloud.task.single-instance-enabled=true` を持つタスクを実行しようとすると、次のエラーメッセージが表示されてタスクが失敗します: Task with name "application" is already running.
spring.cloud.task.single-instance-enabled
のデフォルト値は false
です。次の例は、spring.cloud.task.single-instance-enabled
を true
に設定する方法を示しています。
spring.cloud.task.single-instance-enabled=true or false
この機能を使用するには、次の Spring Integration 依存関係をアプリケーションに追加する必要があります。
<dependency>
<groupId>org.springframework.integration</groupId>
<artifactId>spring-integration-core</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.integration</groupId>
<artifactId>spring-integration-jdbc</artifactId>
</dependency>
この機能が有効になっており、別のタスクが同じタスク名で実行されているためにタスクが失敗した場合、アプリケーションの終了コードは 1 になります。 |
8.9.1. Spring AOT およびネイティブコンパイルの単一インスタンスの使用
ネイティブコンパイルされたアプリの作成時に Spring Cloud Task の単一インスタンス機能を使用するには、ビルド時に機能を有効にする必要があります。これを行うには、次のように process-aot 実行を追加し、JVM 引数として spring.cloud.task.single-step-instance-enabled=true
を設定します。
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
<executions>
<execution>
<id>process-aot</id>
<goals>
<goal>process-aot</goal>
</goals>
<configuration>
<jvmArguments>
-Dspring.cloud.task.single-instance-enabled=true
</jvmArguments>
</configuration>
</execution>
</executions>
</plugin>
8.10. ApplicationRunner および CommandLineRunner の監視の有効化
ApplicationRunner
または CommandLineRunner
のタスク監視を有効にするには、spring.cloud.task.observation.enabled
を true に設定します。
SimpleMeterRegistry
を使用して観察を可能にするタスクアプリケーションの例は、ここにあります。
8.11. Spring Cloud Task 自動構成の無効化
Spring Cloud Task を実装用に自動構成すべきでない場合は、タスクの自動構成を無効にすることができます。これを行うには、次のアノテーションをタスクアプリケーションに追加します。
@EnableAutoConfiguration(exclude={SimpleTaskAutoConfiguration.class})
spring.cloud.task.autoconfiguration.enabled
プロパティを false
に設定して、タスクの自動構成を無効にすることもできます。
8.12. コンテキストを閉じる
アプリケーションがタスクの完了時に ApplicationContext
を閉じる必要がある場合 (すべての *Runner#run
メソッドが呼び出され、タスクリポジトリが更新されている場合)、プロパティ spring.cloud.task.closecontextEnabled
を true
に設定します。
コンテキストを閉じるもう 1 つのケースは、タスクの実行が完了してもアプリケーションが終了しない場合です。このような場合、スレッドが割り当てられているため、コンテキストは開いたままになります (たとえば、TaskExecutor を使用している場合)。このような場合は、タスクの起動時に spring.cloud.task.closecontextEnabled
プロパティを true
に設定します。これにより、タスクが完了するとアプリケーションのコンテキストが閉じられます。アプリケーションの終了が許可されます。
8.13. タスクメトリクスを有効にする
Spring Cloud Task は Micrometer と統合し、実行するタスクの監視を作成します。タスク監視の統合を有効にするには、spring-boot-starter-actuator
、優先レジストリ実装 (メトリクスを公開する場合)、およびマイクロメータートレーシング (トレースデータを公開する場合) をタスクアプリケーションに追加する必要があります。Influx を使用してタスクの可観測性とメトリクスを有効にするための maven 依存関係セットの例は次のようになります。
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-actuator</artifactId>
</dependency>
<dependency>
<groupId>io.micrometer</groupId>
<artifactId>micrometer-registry-influx</artifactId>
<scope>runtime</scope>
</dependency>
8.14. Spring タスクと Spring Cloud Task プロパティ
task
という用語は業界で頻繁に使用される言葉です。このような例では、Spring Boot は spring.task
を提供し、Spring Cloud Task は spring.cloud.task
プロパティを提供します。このため、これら 2 つのプロパティグループが直接関連しているということで、過去に混乱が生じていました。ただし、これらは Spring エコシステムで提供される 2 つの異なる機能セットを表しています。
spring.task
は、ThreadPoolTaskScheduler
を構成するプロパティを指します。spring.cloud.task
は、Spring Cloud Task の機能を構成するプロパティを指します。
バッチ
このセクションでは、Spring Cloud Task と Spring Batch の統合について詳しく説明します。このセクションでは、ジョブの実行とそれが実行されたタスク間の関連付けの追跡、および Spring Cloud Deployer による リモートパーティショニングについて説明します。
9. ジョブ実行をそれが実行されたタスクに関連付ける
Spring Boot は、ü ber-jar 内でバッチジョブを実行するための機能を提供します。Spring Boot によるこの機能のサポートにより、開発者はその実行内で複数のバッチジョブを実行できます。Spring Cloud Task は、ジョブの実行 (ジョブ実行) をタスクの実行に関連付けて、一方を他方に追跡できるようにする機能を提供します。
Spring Cloud Task は、TaskBatchExecutionListener
を使用してこの機能を実現します。デフォルトでは、このリスナーは、Spring Batch ジョブ (コンテキスト内で定義された型 Job
の Bean を持つことによって) とクラスパス上の spring-cloud-task-batch
jar の両方を持つコンテキストで自動的に設定されます。リスナーは、これらの条件を満たすすべてのジョブに挿入されます。
9.1. TaskBatchExecutionListener のオーバーライド
現在のコンテキスト内のバッチジョブにリスナーが挿入されないようにするには、標準の Spring Boot メカニズムを使用して自動構成を無効にします。
コンテキスト内の特定のジョブにのみリスナーを挿入するには、次の例に示すように、batchTaskExecutionListenerBeanPostProcessor
をオーバーライドし、ジョブ Bean ID のリストを指定します。
public static TaskBatchExecutionListenerBeanPostProcessor batchTaskExecutionListenerBeanPostProcessor() {
TaskBatchExecutionListenerBeanPostProcessor postProcessor =
new TaskBatchExecutionListenerBeanPostProcessor();
postProcessor.setJobNames(Arrays.asList(new String[] {"job1", "job2"}));
return postProcessor;
}
サンプルバッチアプリケーションは、Spring Cloud Task プロジェクトのサンプルモジュール ( こちら) [GitHub] (英語) にあります。 |
10. リモートパーティショニング
Spring Cloud Deployer は、ほとんどのクラウドインフラストラクチャ上で Spring Boot ベースのアプリケーションを起動するための機能を提供します。DeployerPartitionHandler
および DeployerStepExecutionHandler
は、ワーカーステップ実行の起動を Spring Cloud Deployer に委譲します。
DeployerStepExecutionHandler
を構成するには、実行する Spring Boot ü ber-jar を表す Resource
、TaskLauncherHandler
、JobExplorer
を指定する必要があります。任意の環境プロパティのほか、一度に実行する ワーカーの最大数、結果をポーリングする間隔 (デフォルトは 10 秒)、およびタイムアウト (デフォルトは -1 またはタイムアウトなし) を構成できます。次の例は、この PartitionHandler
の構成がどのように見えるかを示しています。
@Bean
public PartitionHandler partitionHandler(TaskLauncher taskLauncher,
JobExplorer jobExplorer) throws Exception {
MavenProperties mavenProperties = new MavenProperties();
mavenProperties.setRemoteRepositories(new HashMap<>(Collections.singletonMap("springRepo",
new MavenProperties.RemoteRepository(repository))));
Resource resource =
MavenResource.parse(String.format("%s:%s:%s",
"io.spring.cloud",
"partitioned-batch-job",
"1.1.0.RELEASE"), mavenProperties);
DeployerPartitionHandler partitionHandler =
new DeployerPartitionHandler(taskLauncher, jobExplorer, resource, "workerStep");
List<String> commandLineArgs = new ArrayList<>(3);
commandLineArgs.add("--spring.profiles.active=worker");
commandLineArgs.add("--spring.cloud.task.initialize.enable=false");
commandLineArgs.add("--spring.batch.initializer.enabled=false");
partitionHandler.setCommandLineArgsProvider(
new PassThroughCommandLineArgsProvider(commandLineArgs));
partitionHandler.setEnvironmentVariablesProvider(new NoOpEnvironmentVariablesProvider());
partitionHandler.setMaxWorkers(2);
partitionHandler.setApplicationName("PartitionedBatchJobTask");
return partitionHandler;
}
環境変数をパーティションに渡す場合、各パーティションは異なる環境設定を持つ異なるマシン上に存在する可能性があります。必要な環境変数のみを渡す必要があります。 |
上の例では、ワーカーの最大数を 2 に設定していることに注意してください。ワーカーの最大数を設定すると、一度に実行する必要があるパーティションの最大数が確立されます。
実行される Resource
は、現在のコンテキストで CommandLineRunner
として構成された DeployerStepExecutionHandler
を備えた Spring Boot ü ber-jar であることが予想されます。前の例で列挙されたリポジトリは、ü ber-jar が配置されている リモートリポジトリである必要があります。マネージャーと ワーカーは両方とも、ジョブリポジトリおよびタスクリポジトリとして使用されている同じデータストアを認識できることが期待されます。基盤となるインフラストラクチャが Spring Boot jar をブートストラップし、Spring Boot が DeployerStepExecutionHandler
を起動すると、ステップハンドラーはリクエストされた Step
を実行します。次の例は、DeployerStepExecutionHandler
を構成する方法を示しています。
@Bean
public DeployerStepExecutionHandler stepExecutionHandler(JobExplorer jobExplorer) {
DeployerStepExecutionHandler handler =
new DeployerStepExecutionHandler(this.context, jobExplorer, this.jobRepository);
return handler;
}
リモートパーティションアプリケーションのサンプルは、Spring Cloud Task プロジェクトのサンプルモジュール ( こちら) [GitHub] (英語) にあります。 |
10.1. リモートバッチパーティションを非同期的に起動する
デフォルトでは、バッチパーティションは順番に起動されます。ただし、リソース (Kubernetes での pod のプロビジョニングなど) がプロビジョニングされるまで各起動がブロックされるため、場合によってはこれがパフォーマンスに影響を与える可能性があります。このような場合は、ThreadPoolTaskExecutor
を DeployerPartitionHandler
に提供できます。これにより、ThreadPoolTaskExecutor
の構成に基づいて リモートバッチパーティションが起動されます。例:
@Bean
public ThreadPoolTaskExecutor threadPoolTaskExecutor() {
ThreadPoolTaskExecutor executor = new ThreadPoolTaskExecutor();
executor.setCorePoolSize(4);
executor.setThreadNamePrefix("default_task_executor_thread");
executor.setWaitForTasksToCompleteOnShutdown(true);
executor.initialize();
return executor;
}
@Bean
public PartitionHandler partitionHandler(TaskLauncher taskLauncher, JobExplorer jobExplorer,
TaskRepository taskRepository, ThreadPoolTaskExecutor executor) throws Exception {
Resource resource = this.resourceLoader
.getResource("maven://io.spring.cloud:partitioned-batch-job:2.2.0.BUILD-SNAPSHOT");
DeployerPartitionHandler partitionHandler =
new DeployerPartitionHandler(taskLauncher, jobExplorer, resource,
"workerStep", taskRepository, executor);
...
}
ThreadPoolTaskExecutor を使用するとスレッドがアクティブなままになり、アプリが終了しないため、コンテキストを閉じる必要があります。アプリケーションを適切に閉じるには、spring.cloud.task.closecontextEnabled プロパティを true に設定する必要があります。 |
10.2. Kubernetes Platform 用のバッチパーティションアプリケーションの開発に関する注意事項
Kubernetes プラットフォームにパーティション分割されたアプリをデプロイする場合は、Spring Cloud Kubernetes Deployer に対して次の依存関係を使用する必要があります。
<dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-deployer-kubernetes</artifactId> </dependency>
タスクアプリケーションとそのパーティションのアプリケーション名は、正規表現パターン
[a-z0-9]([-a-z0-9]*[a-z0-9])
に従う必要があります。それ以外の場合は、例外がスローされます。
11. バッチ情報メッセージ
Spring Cloud Task は、バッチジョブが情報メッセージを発行する機能を提供します。"Spring Batch イベント" セクションでは、この機能について詳しく説明します。
12. バッチジョブの終了コード
前に説明したように、Spring Cloud Task アプリケーションは、タスク実行の終了コードを記録する機能をサポートしています。ただし、タスク内で Spring Batch ジョブを実行する場合、バッチジョブの実行がどのように完了したかに関係なく、デフォルトのバッチ /Boot 動作を使用すると、タスクの結果は常に 0 になります。タスクは Boot アプリケーションであり、タスクから返される終了コードは Boot アプリケーションと同じであることに注意してください。この動作をオーバーライドして、バッチジョブが FAILED
の BatchStatus を返したときにタスクがゼロ以外の終了コードを返せるようにするには、spring.cloud.task.batch.fail-on-job-failure
を true
に設定します。この場合、終了コードは 1 (デフォルト)、または指定された ExitCodeGenerator
に基づくことができます)
この機能は、Spring Boot によって提供されるものを置き換える新しい ApplicationRunner
を使用します。デフォルトでは、同じ順序で構成されます。ただし、ApplicationRunner
の実行順序をカスタマイズする場合は、spring.cloud.task.batch.applicationRunnerOrder
プロパティを設定することで順序を設定できます。タスクがバッチジョブの実行結果に基づいて終了コードを返すようにするには、独自の CommandLineRunner
を作成する必要があります。
シングルステップのバッチジョブスターター
ここでは、Spring Cloud Task に含まれるスタータを使用して、Step
単体で Spring Batch Job
を開発する方法について説明します。このスターターを使用すると、構成を使用して ItemReader
、ItemWriter
、または完全なシングルステップ Spring Batch Job
を定義できます。Spring Batch とその機能の詳細については、"Spring Batch ドキュメント" を参照してください。
Maven のスターターを入手するには、以下をビルドに追加します。
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-single-step-batch-job</artifactId>
<version>2.3.0</version>
</dependency>
Gradle のスターターを入手するには、以下をビルドに追加します。
compile "org.springframework.cloud:spring-cloud-starter-single-step-batch-job:2.3.0"
13. ジョブの定義
スターターを使用すると、ItemReader
または ItemWriter
だけを定義したり、完全な Job
を定義したりできます。このセクションでは、Job
を構成するためにどのプロパティを定義する必要があるかを定義します。
13.1. プロパティ
まず、スターターには、ジョブの基本を 1 つのステップで構成できる一連のプロパティが用意されています。
プロパティ | タイプ | デフォルト値 | 説明 |
---|---|---|---|
|
|
| ジョブの名前。 |
|
|
| ステップの名前。 |
|
|
| トランザクションごとに処理されるアイテムの数。 |
上記のプロパティを構成すると、単一のチャンクベースのステップを持つジョブが作成されます。このチャンクベースのステップは、Map<String, Object>
インスタンスを項目として読み取り、処理し、書き込みます。ただし、このステップではまだ何も行われません。何らかの処理を行うには、ItemReader
、オプションの ItemProcessor
、および ItemWriter
を構成する必要があります。これらのいずれかを構成するには、プロパティを使用して自動構成を提供するオプションの 1 つを構成するか、標準の Spring 構成メカニズムを使用して独自のオプションを構成することができます。
独自に構成する場合は、入力型と出力型がステップ内の他の型と一致する必要があります。このスターターの ItemReader 実装と ItemWriter 実装はすべて、入力項目と出力項目として Map<String, Object> を使用します。 |
14. ItemReader 実装の自動構成
このスターターは、4 つの異なる ItemReader
実装 ( AmqpItemReader
、FlatFileItemReader
、JdbcCursorItemReader
、KafkaItemReader
) の自動構成を提供します。このセクションでは、提供された自動構成を使用してこれらのそれぞれを構成する方法の概要を説明します。
14.1. AmqpItemReader
AmqpItemReader
を使用すると、AMQP でキューまたはトピックから読み取ることができます。この ItemReader
実装の自動構成は、2 つの構成セットに依存します。1 つ目は、AmqpTemplate
の構成です。これを自分で設定することも、Spring Boot が提供する自動構成を使用することもできます。Spring Boot AMQP ドキュメント (英語) を参照してください。AmqpTemplate
を構成したら、次のプロパティを設定することでバッチ機能を有効にしてそれをサポートできます。
プロパティ | タイプ | デフォルト値 | 説明 |
---|---|---|---|
|
|
|
|
|
|
| メッセージを解析するために |
詳しくは、AmqpItemReader
ドキュメント (Javadoc) を参照してください。
14.2. FlatFileItemReader
FlatFileItemReader
を使用すると、フラットファイル (CSV やその他のファイル形式など) から読み取ることができます。ファイルから読み取るには、通常の Spring 構成 (LineTokenizer
、RecordSeparatorPolicy
、FieldSetMapper
、LineMapper
または SkippedLinesCallback
) を通じていくつかのコンポーネントを自分で提供できます。次のプロパティを使用してリーダーを構成することもできます。
プロパティ | タイプ | デフォルト値 | 説明 |
---|---|---|---|
|
|
| 再起動のために状態を保存するかどうかを決定します。 |
|
|
|
|
|
|
| ファイルから読み取られる項目の最大数。 |
|
| 0 | すでに読まれたアイテムの数。再起動時に使用されます。 |
|
| 空のリスト | ファイル内のコメント行 (無視される行) を示す文字列のリスト。 |
|
|
| 読み取られるリソース。 |
|
|
|
|
|
|
| ファイルを読み取るときに使用されるエンコーディング。 |
|
| 0 | ファイルの先頭でスキップする行数を示します。 |
|
|
| ファイルが区切りファイル (CSV およびその他の形式) であるかどうかを示します。このプロパティまたは |
|
|
| 区切り文字で区切られたファイルを読み取る場合、解析する区切り文字を示します。 |
|
|
| 値を引用符で囲むために使用される文字を決定するために使用されます。 |
|
| 空のリスト | レコード内のどのフィールドをアイテムに含めるかを決定するインデックスのリスト。 |
|
|
| ファイルのレコードが列番号によって解析されるかどうかを示します。このプロパティまたは |
|
| 空のリスト | 固定幅レコードを解析するための列範囲のリスト。範囲に関するドキュメント (Javadoc) を参照してください。 |
|
|
| レコードから解析された各フィールドの名前のリスト。これらの名前は、この |
|
|
|
|
FlatFileItemReader
ドキュメント (Javadoc) を参照してください。
14.3. JdbcCursorItemReader
JdbcCursorItemReader
は、リレーショナルデータベースに対してクエリを実行し、結果のカーソル (ResultSet
) を反復処理して、結果の項目を提供します。この自動構成により、PreparedStatementSetter
、RowMapper
、またはその両方を提供できます。次のプロパティを使用して JdbcCursorItemReader
を構成することもできます。
プロパティ | タイプ | デフォルト値 | 説明 |
---|---|---|---|
|
|
| 再起動のために状態を保存するかどうかを決定します。 |
|
|
|
|
|
|
| ファイルから読み取られる項目の最大数。 |
|
| 0 | すでに読まれたアイテムの数。再起動時に使用されます。 |
|
| データベースシステムへの呼び出しごとに取得するレコードの数を示すドライバーへのヒント。最高のパフォーマンスを得るには、通常、チャンクサイズと一致するように設定する必要があります。 | |
|
| データベースから読み取るアイテムの最大数。 | |
|
| クエリがタイムアウトするまでのミリ秒数。 | |
|
|
| リーダーが処理時に SQL 警告を無視するかどうかを決定します。 |
|
|
|
|
|
|
| ドライバーがカーソルの絶対位置をサポートするかどうかを示します。 |
|
|
| 接続が他の処理と共有されているかどうか (つまり、トランザクションの一部であるか) を示します。 |
|
|
| 読み取り元の SQL クエリ。 |
次のプロパティを使用して、リーダー専用に JDBC DataSource を指定することもできます。JdbcCursorItemReader
のプロパティ
プロパティ | タイプ | デフォルト値 | 説明 |
---|---|---|---|
|
|
|
|
|
|
| データベースの JDBC URL。 |
|
|
| データベースのログインユーザー名。 |
|
|
| データベースのログインパスワード。 |
|
|
| JDBC ドライバーの完全修飾名。 |
jdbccursoritemreader_datasource が指定されていない場合、デフォルトの DataSource が JDBCCursorItemReader によって使用されます。 |
JdbcCursorItemReader
ドキュメント (Javadoc) を参照してください。
14.4. KafkaItemReader
Kafka トピックからデータのパーティションを取り込むことは便利であり、まさに KafkaItemReader
で実行できることです。KafkaItemReader
を構成するには、2 つの構成が必要です。まず、Spring Boot の Kafka 自動構成を使用して Kafka を構成する必要があります ( "Spring Boot Kafka ドキュメント" を参照)。Spring Boot から Kafka プロパティを構成したら、次のプロパティを設定して KafkaItemReader
自体を構成できます。
プロパティ | タイプ | デフォルト値 | 説明 |
---|---|---|---|
|
|
|
|
|
|
| 読み取り元のトピックの名前。 |
|
| 空のリスト | 読み取り対象のパーティションインデックスのリスト。 |
|
| 30 |
|
|
|
| 再起動のために状態を保存するかどうかを決定します。 |
KafkaItemReader
ドキュメント (Javadoc) を参照してください。
14.5. ネイティブコンパイル
シングルステップバッチ処理の利点は、JVM の使用時に実行時に使用するリーダー Bean とライター Bean を動的に選択できることです。ただし、ネイティブコンパイルを使用する場合は、実行時ではなくビルド時にリーダーとライターを決定する必要があります。次の例ではこれを実行します。
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
<executions>
<execution>
<id>process-aot</id>
<goals>
<goal>process-aot</goal>
</goals>
<configuration>
<jvmArguments>
-Dspring.batch.job.flatfileitemreader.name=fooReader
-Dspring.batch.job.flatfileitemwriter.name=fooWriter
</jvmArguments>
</configuration>
</execution>
</executions>
</plugin>
15. ItemProcessor の設定
シングルステップのバッチジョブ自動構成は、ApplicationContext
内で ItemProcessor
が使用可能な場合、それを受け入れます。正しい型 (ItemProcessor<Map<String, Object>, Map<String, Object>>
) のものが見つかると、それがステップにオートワイヤーされます。
16. ItemWriter 実装の自動構成
このスターターは、サポートされている ItemReader
実装 ( AmqpItemWriter
、FlatFileItemWriter
、JdbcItemWriter
、KafkaItemWriter
) と一致する ItemWriter
実装の自動構成を提供します。このセクションでは、自動構成を使用してサポートされている ItemWriter
を構成する方法について説明します。
16.1. AmqpItemWriter
RabbitMQ キューに書き込むには、2 つの設定セットが必要です。まず、AmqpTemplate
が必要です。これを取得する最も簡単な方法は、Spring Boot の RabbitMQ 自動構成を使用することです。Spring Boot AMQP ドキュメント (英語) を参照してください。
AmqpTemplate
を構成したら、次のプロパティを設定して AmqpItemWriter
を構成できます。
プロパティ | タイプ | デフォルト値 | 説明 |
---|---|---|---|
|
|
|
|
|
|
| メッセージを変換するために |
16.2. FlatFileItemWriter
ステップの出力としてファイルを書き込むには、FlatFileItemWriter
を構成します。自動構成は、明示的に構成されたコンポーネント ( LineAggregator
、FieldExtractor
、FlatFileHeaderCallback
、FlatFileFooterCallback
など) と、指定された次のプロパティを設定することによって構成されたコンポーネントを受け入れます。
プロパティ | タイプ | デフォルト値 | 説明 |
---|---|---|---|
|
|
| 読み取られるリソース。 |
|
|
| 出力ファイルが区切りファイルかどうかを示します。 |
|
|
| 出力ファイルがフォーマットされたファイルかどうかを示します。 |
|
|
| フォーマットされたファイルの出力を生成するために使用されるフォーマット。フォーマットは |
|
|
| ファイルの生成時に使用される |
|
| 0 | レコードの最大長。0 の場合、サイズは無制限です。 |
|
| 0 | 最小レコード長。 |
|
|
|
|
|
|
| ファイルを書き込むときに使用するエンコーディング。 |
|
|
| ファイルをフラッシュ時にディスクに強制同期する必要があるかどうかを示します。 |
|
|
| レコードから解析された各フィールドの名前のリスト。これらの名前は、この |
|
|
| 出力ファイルが見つかった場合にファイルを追加するかどうかを示します。 |
|
|
| 出力ファイルの行を区切るために使用する |
|
|
|
|
|
|
| 再起動のために状態を保存するかどうかを決定します。 |
|
|
|
|
|
|
|
|
|
|
| リーダーがトランザクションキューであるかどうかを示します (失敗時に読み取られた項目がキューに返されることを示します)。 |
FlatFileItemWriter
ドキュメント (Javadoc) を参照してください。
16.3. JdbcBatchItemWriter
ステップの出力をリレーショナルデータベースに書き込むために、このスターターは JdbcBatchItemWriter
を自動構成する機能を提供します。自動構成では、次のプロパティを設定することで、独自の ItemPreparedStatementSetter
または ItemSqlParameterSourceProvider
と構成オプションを提供できます。
プロパティ | タイプ | デフォルト値 | 説明 |
---|---|---|---|
|
|
|
|
|
|
| 各項目の挿入に使用される SQL。 |
|
|
| すべての挿入によって少なくとも 1 つのレコードが更新されることを検証するかどうか。 |
次のプロパティを使用して、ライター専用に JDBC DataSource を指定することもできます。JdbcBatchItemWriter
のプロパティ
プロパティ | タイプ | デフォルト値 | 説明 |
---|---|---|---|
|
|
|
|
|
|
| データベースの JDBC URL。 |
|
|
| データベースのログインユーザー名。 |
|
|
| データベースのログインパスワード。 |
|
|
| JDBC ドライバーの完全修飾名。 |
jdbcbatchitemwriter_datasource が指定されていない場合、デフォルトの DataSource が JdbcBatchItemWriter によって使用されます。 |
JdbcBatchItemWriter
ドキュメント (Javadoc) を参照してください。
16.4. KafkaItemWriter
ステップ出力を Kafka トピックに書き込むには、KafkaItemWriter
が必要です。このスターターは、2 つの場所の機能を使用して、KafkaItemWriter
の自動構成を提供します。1 つ目は、Spring Boot の Kafka 自動構成です。(Spring Boot Kafka ドキュメントを参照してください) 次に、このスターターを使用すると、ライター上で 2 つのプロパティを構成できます。
プロパティ | タイプ | デフォルト値 | 説明 |
---|---|---|---|
|
|
| 書き込む先の Kafka トピック。 |
|
|
| ライターに渡される項目をすべて削除イベントとしてトピックに送信するかどうか。 |
KafkaItemWriter
の構成オプションの詳細については、"KafkaItemWiter
ドキュメント (Javadoc) " を参照してください。
16.5. Spring AOT
シングルステップバッチスターターで Spring AOT を使用する場合は、コンパイル時にリーダーとライターの名前プロパティを設定する必要があります (リーダーまたはライター用の Bean を作成しない場合)。これを行うには、Boot maven プラグインまたは gradle プラグインの引数または環境変数として使用するリーダーおよびライターの名前を含める必要があります。たとえば、Maven で FlatFileItemReader
と FlatFileItemWriter
を有効にしたい場合は、次のようになります。
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
<executions>
<execution>
<id>process-aot</id>
<goals>
<goal>process-aot</goal>
</goals>
</execution>
</executions>
<configuration>
<arguments>
<argument>--spring.batch.job.flatfileitemreader.name=foobar</argument>
<argument>--spring.batch.job.flatfileitemwriter.name=fooWriter</argument>
</arguments>
</configuration>
</plugin>
Spring Cloud Stream 統合
タスクはそれ自体でも便利ですが、タスクをより大きなエコシステムに統合すると、より複雑な処理やオーケストレーションに役立つようになります。このセクションでは、Spring Cloud Task と Spring Cloud Stream の統合オプションについて説明します。
17. Spring Cloud Stream からのタスクの起動
ストリームからタスクを起動できます。これを行うには、ペイロードとして TaskLaunchRequest
を含むメッセージをリッスンするシンクを作成します。TaskLaunchRequest
には次のものが含まれます。
uri
: 実行されるタスクアーティファクトへ。applicationName
: タスクに関連付けられた名前。applicationName が設定されていない場合、TaskLaunchRequest
は次の要素で構成されるタスク名を生成します。:Task-<UUID>
.commandLineArguments
: タスクのコマンドライン引数を含むリスト。environmentProperties
: タスクで使用される環境変数を含むマップ。deploymentProperties
: デプロイヤーがタスクをデプロイするために使用するプロパティを含むマップ。
ペイロードの型が異なる場合、シンクは例外をスローします。 |
例: HTTP ソースからデータを取り込み、TaskLaunchRequest
を含む GenericMessage
を作成し、その出力チャネルにメッセージを送信するプロセッサーを備えたストリームを作成できます。タスクシンクは入力チャネルからメッセージを受信し、タスクを起動します。
taskSink を作成するには、次の例に示すように、EnableTaskLauncher
アノテーションを含む Spring Boot アプリケーションを作成するだけです。
@SpringBootApplication
@EnableTaskLauncher
public class TaskSinkApplication {
public static void main(String[] args) {
SpringApplication.run(TaskSinkApplication.class, args);
}
}
Spring Cloud Task プロジェクトのサンプルモジュール [GitHub] (英語) には、サンプルのシンクとプロセッサーが含まれています。これらのサンプルをローカル maven リポジトリにインストールするには、次の例に示すように、skipInstall
プロパティを false
に設定して spring-cloud-task-samples
ディレクトリから maven ビルドを実行します。
mvn clean install
maven.remoteRepositories.springRepo.url プロパティは、ü ber-jar が配置されている リモートリポジトリの場所に設定する必要があります。設定されていない場合、リモートリポジトリは存在しないため、ローカルリポジトリのみに依存します。 |
17.1. Spring Cloud Data Flow
Spring Cloud Data Flow でストリームを作成するには、まず作成したタスクシンクアプリケーションを登録する必要があります。次の例では、Spring Cloud Data Flow シェルを使用してプロセッサーとシンクのサンプルアプリケーションを登録しています。
app register --name taskSink --type sink --uri maven://io.spring.cloud:tasksink:<version>
app register --name taskProcessor --type processor --uri maven:io.spring.cloud:taskprocessor:<version>
次の例は、Spring Cloud Data Flow シェルからストリームを作成する方法を示しています。
stream create foo --definition "http --server.port=9000|taskProcessor|taskSink" --deploy
18. Spring Cloud Task イベント
Spring Cloud Task は、タスクが Spring Cloud Stream チャネルを通じて実行されるときに、Spring Cloud Stream チャネルを通じてイベントを発行する機能を提供します。タスクリスナーは、task-events
という名前のメッセージチャネルで TaskExecution
をパブリッシュするために使用されます。この機能は、spring-cloud-stream
、spring-cloud-stream-<binder>
、クラスパス上に定義されたタスクを持つタスクに自動接続されます。
イベント発行リスナーを無効にするには、spring.cloud.task.events.enabled プロパティを false に設定します。 |
適切なクラスパスが定義されていると、次のタスクは task-events
チャネル上のイベントとして TaskExecution
を発行します (タスクの開始時と終了時の両方で)。
@SpringBootApplication
public class TaskEventsApplication {
public static void main(String[] args) {
SpringApplication.run(TaskEventsApplication.class, args);
}
@Configuration
public static class TaskConfiguration {
@Bean
public ApplicationRunner applicationRunner() {
return new ApplicationRunner() {
@Override
public void run(ApplicationArguments args) {
System.out.println("The ApplicationRunner was executed");
}
};
}
}
}
バインダー実装もクラスパス上にある必要があります。 |
サンプルタスクイベントアプリケーションは、Spring Cloud Task プロジェクトのサンプルモジュール ( こちら) [GitHub] (英語) にあります。 |
18.1. 特定のタスクイベントの無効化
タスクイベントを無効にするには、spring.cloud.task.events.enabled
プロパティを false
に設定します。
19. Spring Batch イベント
タスクを通じて Spring Batch ジョブを実行する場合、Spring Batch で使用可能な Spring Batch リスナーに基づいて情報メッセージを発行するように Spring Cloud Task を構成できます。具体的には、次の Spring Batch リスナーが各バッチジョブに自動構成され、Spring Cloud Task を通じて実行されるときに、関連する Spring Cloud Stream チャネルにメッセージを送信します。
JobExecutionListener
はjob-execution-events
をリッスンしますStepExecutionListener
はstep-execution-events
をリッスンしますChunkListener
はchunk-events
をリッスンしますItemReadListener
はitem-read-events
をリッスンしますItemProcessListener
はitem-process-events
をリッスンしますItemWriteListener
はitem-write-events
をリッスンしますSkipListener
はskip-events
をリッスンします
適切な Bean ( Job
および TaskLifecycleListener
) がコンテキスト内に存在する場合、これらのリスナーは AbstractJob
に自動構成されます。これらのイベントをリッスンするための構成は、他の Spring Cloud Stream チャネルへのバインドと同じ方法で処理されます。私たちのタスク (バッチジョブを実行するタスク) は Source
として機能し、リスニングアプリケーションは Processor
または Sink
として機能します。
たとえば、アプリケーションがジョブの開始と停止のために job-execution-events
チャネルをリッスンすることが考えられます。リスニングアプリケーションを構成するには、次のように入力が job-execution-events
になるように構成します。
spring.cloud.stream.bindings.input.destination=job-execution-events
バインダー実装もクラスパス上にある必要があります。 |
バッチイベントアプリケーションのサンプルは、Spring Cloud Task プロジェクトのサンプルモジュール ( こちら) [GitHub] (英語) にあります。 |
19.1. バッチイベントを別のチャネルに送信する
Spring Cloud Task がバッチイベントに対して提供するオプションの 1 つは、特定のリスナーがメッセージを送信できるチャネルを変更する機能です。これを行うには、次の構成を使用します: spring.cloud.stream.bindings.<the channel>.destination=<new destination>
。例: StepExecutionListener
がデフォルトの step-execution-events
ではなく my-step-execution-events
という別のチャネルにメッセージを送信する必要がある場合、次の構成を追加できます。
spring.cloud.task.batch.events.step-execution-events-binding-name=my-step-execution-events
19.2. バッチイベントの無効化
すべてのバッチイベントのリスナー機能を無効にするには、次の構成を使用します。
spring.cloud.task.batch.events.enabled=false
特定のバッチイベントを無効にするには、次の構成を使用します。
spring.cloud.task.batch.events.<batch event listener>.enabled=false
:
次のリストは、無効にできる個々のリスナーを示しています。
spring.cloud.task.batch.events.job-execution.enabled=false
spring.cloud.task.batch.events.step-execution.enabled=false
spring.cloud.task.batch.events.chunk.enabled=false
spring.cloud.task.batch.events.item-read.enabled=false
spring.cloud.task.batch.events.item-process.enabled=false
spring.cloud.task.batch.events.item-write.enabled=false
spring.cloud.task.batch.events.skip.enabled=false
19.3. バッチイベントの発行順序
デフォルトでは、バッチイベントには Ordered.LOWEST_PRECEDENCE
があります。この値を変更するには (たとえば、5 に)、次の構成を使用します。
spring.cloud.task.batch.events.job-execution-order=5
spring.cloud.task.batch.events.step-execution-order=5
spring.cloud.task.batch.events.chunk-order=5
spring.cloud.task.batch.events.item-read-order=5
spring.cloud.task.batch.events.item-process-order=5
spring.cloud.task.batch.events.item-write-order=5
spring.cloud.task.batch.events.skip-order=5
付録
20. タスクリポジトリスキーマ
この付録では、タスクリポジトリで使用されるデータベーススキーマの ERD を提供します。
20.1. テーブル情報
タスクの実行情報を格納します。
列名 | 必須 | タイプ | フィールド長 | ノート |
---|---|---|---|---|
TASK_EXECUTION_ID | TRUE | BIGINT | ○ | Spring Cloud Task フレームワークは、アプリの起動時に、 |
START_TIME | FALSE | DATETIME(6) | ○ | アプリ起動時の Spring Cloud Task フレームワークによって値が設定されます。 |
END_TIME | FALSE | DATETIME(6) | ○ | アプリ終了時の Spring Cloud Task フレームワークによって値が確立されます。 |
TASK_NAME | FALSE | VARCHAR | 100 | ユーザーが |
EXIT_CODE | FALSE | INTEGER | ○ | ここで説明するようにユーザーがオーバーライドしない限り、Spring Boot のデフォルトに従います。 |
EXIT_MESSAGE | FALSE | VARCHAR | 2500 | ここで説明したユーザー定義。 |
ERROR_MESSAGE | FALSE | VARCHAR | 2500 | アプリ終了時の Spring Cloud Task フレームワークによって値が確立されます。 |
LAST_UPDATED | TRUE | TIMESTAMP | ○ | アプリ起動時の Spring Cloud Task フレームワークによって値が設定されます。または、レコードがタスクの外部で作成される場合は、レコードの作成時に値を入力する必要があります。 |
EXTERNAL_EXECUTION_ID | FALSE | VARCHAR | 250 |
|
PARENT_TASK_EXECUTION_ID | FALSE | BIGINT | ○ |
|
タスクの実行に使用されるパラメーターを保存します
列名 | 必須 | タイプ | フィールド長 |
---|---|---|---|
TASK_EXECUTION_ID | TRUE | BIGINT | ○ |
TASK_PARAM | FALSE | VARCHAR | 2500 |
タスクの実行をバッチの実行にリンクするために使用されます。
列名 | 必須 | タイプ | フィールド長 |
---|---|---|---|
TASK_EXECUTION_ID | TRUE | BIGINT | ○ |
JOB_EXECUTION_ID | TRUE | BIGINT | ○ |
ここで説明する single-instance-enabled
機能に使用されます。
列名 | 必須 | タイプ | フィールド長 | ノート |
---|---|---|---|---|
LOCK_KEY | TRUE | CHAR | 36 | このロックの UUID |
REGION | TRUE | VARCHAR | 100 | ユーザーは、このフィールドを使用してロックのグループを確立できます。 |
CLIENT_ID | TRUE | CHAR | 36 | ロックするアプリの名前を含むタスク実行 ID。 |
CREATED_DATE | TRUE | DATETIME | ○ | エントリが作成された日付 |
各データベース型のテーブルを設定するための DDL は、ここにあります。 |
20.2. SQL Server
デフォルトでは、Spring Cloud Task は、TASK_EXECUTION
テーブルの TASK_EXECUTION_ID
を決定するためにシーケンステーブルを使用します。ただし、SQL Server の使用中に複数のタスクを同時に起動すると、TASK_SEQ
テーブルでデッドロックが発生する可能性があります。解決策は、TASK_EXECUTION_SEQ
テーブルを削除し、同じ名前を使用してシーケンスを作成することです。例:
DROP TABLE TASK_SEQ;
CREATE SEQUENCE [DBO].[TASK_SEQ] AS BIGINT
START WITH 1
INCREMENT BY 1;
START WITH を現在の実行 ID よりも高い値に設定します。 |
21. このドキュメントの作成
このプロジェクトでは、Maven を使用してこのドキュメントを生成します。自分で生成するには、コマンド $ mvn clean install -DskipTests -P docs
を実行します。
22. 可観測性メタデータ
22.1. 可観測性 - メトリクス
以下に、このプロジェクトで宣言されたすべての指標のリストを示します。
22.1.1. タスクがアクティブです
タスクの実行に関して作成されるメトリクス。
指標名 spring.cloud.task
(規約クラス org.springframework.cloud.task.listener.DefaultTaskExecutionObservationConvention
で定義)。タイプ timer
.
指標名 spring.cloud.task.active
(規約クラス org.springframework.cloud.task.listener.DefaultTaskExecutionObservationConvention
で定義)。タイプ long task timer
.
観測の開始後に追加された KeyValues は、*.active メトリクスから欠落している可能性があります。 |
Micrometer は、ベースユニットに nanoseconds を内部的に使用します。ただし、各バックエンドが実際のベースユニットを決定します。(つまり、Prometheus は秒を使用します) |
外側のクラス org.springframework.cloud.task.listener.TaskExecutionObservation
の完全修飾名。
すべてのタグには、spring.cloud.task プレフィックスを付ける必要があります。 |
名前 | 説明 |
| CF クラウドのアプリ ID。 |
| CF クラウドのアプリ名。 |
| CF クラウドのアプリ版。 |
| CF クラウドのインスタンスインデックス。 |
| CF クラウドの組織名。 |
| CF クラウドのスペース ID。 |
| CF クラウドのスペース名。 |
| タスク実行 ID。 |
| タスクの終了コード。 |
| タスクの外部実行 ID。 |
| タスク名の測定。 |
| タスクの親実行 ID。 |
| タスクのステータス。成功することもあれば失敗することもあります。 |
22.1.2. タスクランナーの観察
タスクランナーの実行時に作成されるオブザベーション。
指標名 spring.cloud.task.runner
(規約クラス org.springframework.cloud.task.configuration.observation.DefaultTaskObservationConvention
で定義)。タイプ timer
.
指標名 spring.cloud.task.runner.active
(規約クラス org.springframework.cloud.task.configuration.observation.DefaultTaskObservationConvention
で定義)。タイプ long task timer
.
観測の開始後に追加された KeyValues は、*.active メトリクスから欠落している可能性があります。 |
Micrometer は、ベースユニットに nanoseconds を内部的に使用します。ただし、各バックエンドが実際のベースユニットを決定します。(つまり、Prometheus は秒を使用します) |
外側のクラス org.springframework.cloud.task.configuration.observation.TaskDocumentedObservation
の完全修飾名。
すべてのタグには、spring.cloud.task プレフィックスを付ける必要があります。 |
名前 | 説明 |
| Spring Cloud Task によって実行された Bean の名前。 |
22.2. 可観測性 - スパン
以下に、このプロジェクトで宣言されたすべてのスパンのリストを示します。
22.2.1. タスクのアクティブなスパン
タスクの実行に関して作成されるメトリクス。
スパン名 spring.cloud.task
(規約クラス org.springframework.cloud.task.listener.DefaultTaskExecutionObservationConvention
で定義)。
外側のクラス org.springframework.cloud.task.listener.TaskExecutionObservation
の完全修飾名。
すべてのタグには、spring.cloud.task プレフィックスを付ける必要があります。 |
名前 | 説明 |
| CF クラウドのアプリ ID。 |
| CF クラウドのアプリ名。 |
| CF クラウドのアプリ版。 |
| CF クラウドのインスタンスインデックス。 |
| CF クラウドの組織名。 |
| CF クラウドのスペース ID。 |
| CF クラウドのスペース名。 |
| タスク実行 ID。 |
| タスクの終了コード。 |
| タスクの外部実行 ID。 |
| タスク名の測定。 |
| タスクの親実行 ID。 |
| タスクのステータス。成功することもあれば失敗することもあります。 |
22.2.2. タスクランナーの観測期間
タスクランナーの実行時に作成されるオブザベーション。
スパン名 spring.cloud.task.runner
(規約クラス org.springframework.cloud.task.configuration.observation.DefaultTaskObservationConvention
で定義)。
外側のクラス org.springframework.cloud.task.configuration.observation.TaskDocumentedObservation
の完全修飾名。
すべてのタグには、spring.cloud.task プレフィックスを付ける必要があります。 |
名前 | 説明 |
| Spring Cloud Task によって実行された Bean の名前。 |