使用 Spring 批处理集成重新启动块作业执行
Restarting chunk job execution with Spring Batch Integration
我正在使用 Spring 批处理集成将文件从存储桶复制到本地目录并启动读取这些文件的作业。
我遵循了这个教程Transforming File Into a JobLaunchRequest
如果在处理过程中发生异常,没关系,作业会被标记为失败,当我再次启动项目时,作业会重新启动。
但我试过一个危急的情况,当服务器在读取过程中宕机。
当我再次开始时,我收到了以下异常:
Caused by: org.springframework.batch.core.repository.JobExecutionAlreadyRunningException: A job execution for this job is already running: JobExecution: id=1, version=1, startTime=2021-02-12 19:47:47.0, endTime=null, lastUpdated=2021-02-12 19:47:47.0, status=STARTED, exitStatus=exitCode=UNKNOWN;exitDescription=, job=[JobInstance: id=1, version=0, Job=[receivablePositionJob]], jobParameters=[{input.file.name
我验证了重新启动作业背后的逻辑,问题是该步骤标记为已启动但没有 END_TIME。我当然知道这是正确的行为。
有什么办法可以解决这个问题,我强制执行作业吗?
您需要将 job/step 执行状态更新为 FAILED
并将结束时间更新为非空值。这是一个简单的例子:
> update BATCH_JOB_EXECUTION set status = 'FAILED', END_TIME = '2020-01-15 10:10:28.235' where job_execution_id = X;
> update BATCH_STEP_EXECUTION set status = 'FAILED' where job_execution_id = X and step_name='failed step name';
SQL 语法可能因您的数据库服务器而异。这样,您应该能够重新开始执行。
我正在使用 Spring 批处理集成将文件从存储桶复制到本地目录并启动读取这些文件的作业。
我遵循了这个教程Transforming File Into a JobLaunchRequest
如果在处理过程中发生异常,没关系,作业会被标记为失败,当我再次启动项目时,作业会重新启动。
但我试过一个危急的情况,当服务器在读取过程中宕机。
当我再次开始时,我收到了以下异常:
Caused by: org.springframework.batch.core.repository.JobExecutionAlreadyRunningException: A job execution for this job is already running: JobExecution: id=1, version=1, startTime=2021-02-12 19:47:47.0, endTime=null, lastUpdated=2021-02-12 19:47:47.0, status=STARTED, exitStatus=exitCode=UNKNOWN;exitDescription=, job=[JobInstance: id=1, version=0, Job=[receivablePositionJob]], jobParameters=[{input.file.name
我验证了重新启动作业背后的逻辑,问题是该步骤标记为已启动但没有 END_TIME。我当然知道这是正确的行为。
有什么办法可以解决这个问题,我强制执行作业吗?
您需要将 job/step 执行状态更新为 FAILED
并将结束时间更新为非空值。这是一个简单的例子:
> update BATCH_JOB_EXECUTION set status = 'FAILED', END_TIME = '2020-01-15 10:10:28.235' where job_execution_id = X;
> update BATCH_STEP_EXECUTION set status = 'FAILED' where job_execution_id = X and step_name='failed step name';
SQL 语法可能因您的数据库服务器而异。这样,您应该能够重新开始执行。