0

現在実行中の春のバッチを終了する際に問題が発生しています。私が書いた

Set<Long> executions = jobOperator.getRunningExecutions("Job-Builder");
jobOperator.stop(longExecutions.iterator().next());`

春のドキュメントを読んだ後の私のコードで。

私が直面している問題は、ジョブの終了が期待どおりに行われることもあれば、ジョブの終了が行われないこともあります。実際、joboperator で stop を呼び出すたびに、BATCH_JOB_EXECUTION テーブルが更新されます。終了が正常に行われると、バッチ プロセスで jobExecution を強制終了することにより、ジョブのステータスがSTOPPEDに更新されます。それ以外の場合は、バッチの残りのさまざまなフローを完了し、BATCH_JOB_EXECUTION テーブルのステータスをFAILEDに更新します。

しかし、job オペレーターで stop を呼び出すたびに、コンソールにメッセージが表示されます

2020-09-30 18:14:29.780 [http-nio-8081-exec-5] INFO  o.s.b.c.l.s.SimpleJobOperator:428        - Aborting job execution: JobExecution: id=33058, version=2, startTime=2020-09-30 18:14:25.79, endTime=null, lastUpdated=2020-09-30 18:14:28.9, status=STOPPING, exitStatus=exitCode=UNKNOWN;exitDescription=, job=[JobInstance: id=32922, version=0, Job=[Job-Builder]], jobParameters=[{date=1601504064263, time=1601504064262, extractType=false, JobId=1601504064262}]

私のプロジェクトには、一連のフローとステップが含まれています。

すべてのバッチ プロセスは次のように
なります。 JobBuilderFactory には 3
つのフローがあります。各フローにはステップビルダーと 2 つのタスクレットがあります。
各ステップビルダーには、パーティショナーとチャンク (サイズは 100) ベースの itemReader、itemProcessor、および itemWriter があります。

jobBuilderFactory で最初のフローを実行しているときに、停止メソッドを呼び出しています。完了するまでの全プロセスには約 30 分かかります。そのため、停止メソッドを呼び出してから約 20 ~ 25 分かかり、すべてのフローでチャンク サイズが 100 になり、50 万件を超えるレコードを処理しています。

それで、私の質問は、なぜjobExecutionがstopメソッドと呼ばれたときに停止するのか(これが私が望んでいたことです)、なぜjobExecutionを残りの時間停止できないのかということです。

前もって感謝します

4

1 に答える 1

0

それで、私の質問は、なぜjobExecutionがstopメソッドと呼ばれたときに停止するのか(これが私が望んでいたことです)、なぜjobExecutionを残りの時間停止できないのかということです。

あなたが共有したことからその理由を理解するのは簡単ではありませんが、ジョブを停止することについていくつかのメモを与えることができます:

  • jobOperator.stopジョブが停止することを保証するものではなく、ジョブの実行に停止信号を送信するだけです。共有したものから、信号が正しく送信されたかどうかを示す返されたブール値をチェックしていないため、最初にそれを行う必要があります。
  • コードを共有しませんでしたが、停止信号がステップに正しく送信されていることを確認するためStoppableTaskletに代わりに使用する必要があります。Tasklet
于 2020-10-01T09:58:26.140 に答える