2017-05-09 20 views
0

jobOperatorを使用して実行の実行を停止しています。以下は私のサンプルコードです。SpringバッチSimpleJobOperatorはメソッドgetRunningExecutionsによって取得された実行IDを停止できます

Set<Long> executionIds = jobOperator.getRunningExecutions(updateHistoryPriceJob.getName()); 
    for(Long executionId: executionIds){ 
     jobOperator.stop(executionId); 
    } 

ただし、次の例外がスローされます。

Caused by: org.springframework.batch.core.launch.JobExecutionNotRunningException: JobExecution must be running so that it can be stopped: JobExecution: id=495, version=2, startTime=2017-05-09 19:11:15.759, endTime=null, lastUpdated=2017-05-09 23:20:18.583, status=STOPPING, exitStatus=exitCode=UNKNOWN;exitDescription=, job=[JobInstance: id=495, version=0, Job=[updateHistoryPriceJob]], jobParameters=[{date=1494328275738}] 

私はgetRunningExecutionsがストップbatchStatusをチェックするでしょうが、終了時刻がnullの実行を取得することを発見しました。

答えて

1

JobExplorerで検索し、findRunningJobExecutions(String jobName)と呼び出してください。 JobOperationsが作成した基本的な呼び出しですが、IDだけでなくJobExecutionsのセットを返します。

次に、実行を停止する前に、実行ごとにステータスを確認して、STARTEDのステータス(場合によってはSTARTING)になっていることを確認できます。 org.springframework.batch.core.launch.JobExecutionNotRunningException

コードを避けるために

String jobName = updateHistoryPriceJob.getName(); 
Set<JobExecution> executions = jobExplorer.findRunningJobExecutions(jobName); 
for(JobExecution execution : executions){ 
    if (execution.getStatus == BatchStatus.STARTED) { 
     jobOperator.stop(execution.getId()); 
    } 
} 
0

は次のようにリファクタリングすることができます。

Set<JobExecution> jobExecutionsSet= jobExplorer.findRunningJobExecutions(jobName); 
      for (JobExecution jobExecution:jobExecutionsSet) { 
       if (jobExecution.getStatus()== BatchStatus.STARTED|| jobExecution.getStatus()== BatchStatus.STARTING || jobExecution.getStatus()== BatchStatus.STOPPING){ 
        jobOperator.stop(jobExecution.getId()); 
        System.out.println("###########Stopped#########"); 
       } 
      } 
関連する問題