5

ジョブが実行されているときに、同時に再度実行することが許可されていないことを確認するにはどうすればよいですか?

フィードを処理して一時テーブルにデータを入力するのに1時間かかるBJがあります。このBJの最初のステップは、一時テーブルをクリアし、メインストアのフロントテーブルからデータの入力を開始することです。

BJが開始されたとき(初めて実行)、BJを再度開始すると、ステップ1の一部として一時テーブルからコンテンツが削除されるというシナリオを考えてみます。

では、最初の実行が完了しなくなるまで2番目の実行を保持する方法を提案してください。

4

7 に答える 7

4

最初のステップとしてカスタムタスクレットを作成し、その中でJobExecutionDaoを使用してすべてのJobExecutionsを見つけることができます。複数の実行中の場合-例外をスローします。

于 2013-03-27T13:49:58.287 に答える
1

確かに、これは最善の解決策ではありませんが、それでもこれがあなたの状況に役立つことを願っています。

ジョブの実行中は、常に同じパラメーターを使用してジョブを実行するようにしてください。ジョブの実行が正常に完了したら、バッチジョブの実行に対応するエントリを削除するようにcalling-scriptsを構成します。

このようにすると、エラーが発生し、同じジョブを2回同時に実行することはできなくなります。削除すると、シリアル実行が許可されます。

別の方法: 単一のパラメーターを使用してジョブを記述しますjob-execution-id。ジョブを実行する前に、ジョブのバッチテーブルから完了したジョブの最大値をクエリするたびに。ここで、入力パラメーターとして1ずつ増加しjob-execution-idてジョブを実行します。job-execution-id

これは上記よりも良い方法だと思います。SpringBatch自体がこのシナリオを実装するための簡単なオプションを提供するかどうかはわかりません。

于 2013-07-16T08:08:20.293 に答える
1

質問を誤解しているかもしれませんが、ステップ内のタスクレットでを指定することで、単一のステップの並列実行の数を制限できますthrottle-limit。1つを指定すると、一度に1つの実行しかないことを確認する必要があります。

<batch:step id="stepA" next="stepB">
  <batch:tasklet throttle-limit="1">
    <batch:chunk reader="myReader" writer="myWriter" commit-interval="100"/>
  </batch:tasklet>
</batch:step>
于 2013-08-20T12:47:06.500 に答える
0

spring-batch-Admin UIを設定して、ジョブのステータス(失敗/実行中/完了など)を表示できます。Spring Batch Admin UIを適切に設定すると、さまざまなジョブ内のいくつかのタスクのステータスを表示することもできます。

于 2013-03-27T13:32:46.883 に答える
0

単一のJVM内でこれを実装することは、バイナリセマフォを使用して実行可能である必要があります。これにより、同じジョブの並列実行を回避できます。セマフォ値が設定されている場合に実行をスキップしたくない場合は、2番目のインスタンスを待機させるのは少し注意が必要です。

適切な「LeaderElection」実装を使用して、より複雑なシリアル化(Springバッチノード全体を含む)を実行できます。プロジェクトでNetflixキュレーター(Apache Zookeeperレシピ)を使用しました。ここにいくつかのポインタ:https ://github.com/regunathb/Trooper/wiki/Useful-Batch-Libraries

于 2013-06-04T05:33:37.377 に答える
0

これは、前のジョブの実行が完了したときにのみプロパティをインクリメントする特別なインクリメントを作成することによって行いました。

    public class CompletedJobRunIdIncrementer extends RunIdIncrementer {
    private final JobRepository jobRepository;
    private final String jobName;

    public CompletedJobRunIdIncrementer(JobRepository jobRepository, String jobName) {
        this.jobRepository = jobRepository;
        this.jobName = jobName;
    }

    @Override
    public JobParameters getNext(JobParameters parameters) {
        JobExecution lastJobExecution = jobRepository.getLastJobExecution(jobName, parameters);
        return lastJobExecution == null || lastJobExecution.getStatus() == BatchStatus.COMPLETED ? super.getNext(parameters) : parameters;
    }
}

そして、このインクリメントを使用したジョブ:

jobBuilders.get("myJob").incrementer(new CompletedJobRunIdIncrementer(jobRepository, "myJob").start(someTask()).build()
于 2019-01-04T08:17:11.387 に答える
0

JobExecutionListenerのカスタム実装を追加できます。

以下は、リスナーの実装例です。

    @Component
    public class JobExecutionListener implements JobExecutionListener{


@Autowired
private JobExplorer jobExplorer;


@Override
public void beforeJob(JobExecution jobExecution) {
    int runningJobsCount = jobExplorer.findRunningJobExecutions(jobExecution.getJobInstance().getJobName()).size();
    if(runningJobsCount > 1){
        throw new RuntimeException("There are already active running instances of this job, Please cancel those executions first.");
    }
}

@Override
public void afterJob(JobExecution jobExecution) {

}

}

これにより、このジョブのインスタンスがすでに実行されている場合、ジョブの現在の起動が失敗としてマークされます。ビジネス要件に基づいて、この例外を処理できます。

于 2019-10-05T20:11:56.007 に答える