Spring Package after JVM Fails

How to restart jobs after JVM crashes?

I started many work tasks implemented in the Spring Batch framework when my JVM crashed or the system failed. How to restart these jobs after a crash?

+6
source share
3 answers

Basically, you can do the following:

  • Configure JobExplorer factory bean in the context of your application:

  • Configure JobOperator bean in your application context

  • Request jobExplorer for different job names: jobExplorer.getJobNames()

  • For each job from step (3), request jobExplorer for incomplete jobs: jobExplorer.findRunningJobExecutions(String jobName)

  • For each JobExecution from step (4), call: jobOperator.restart(jobExecution.getJobId())

  • Be sure to call this procedure during the boot sequence before another job starts.

Technically, you can combine steps 3 + 4 for something like findRunningJobExecutions() by overriding JobExecutionDao , but the current API does not support it.

For help with the above Spring bean configuration, see the reference documentation

+6
source

Before rebooting, you need to mark the "running" tasks as follows:

 List<String> jobs = jobExplorer.getJobNames(); for (String job : jobs) { Set<JobExecution> runningJobs = jobExplorer.findRunningJobExecutions(job); for (JobExecution runningJob : runningJobs) { try { runningJob.setStatus(BatchStatus.FAILED); runningJob.setEndTime(new Date()); jobRepository.update(runningJob); jobOperator.restart(runningJob.getId()); } catch (Exception e) { LOG.error(e.getMessage(), e); } } } 
+4
source

Here is the complete solution to restart the job after the JVM crashes.

  • Make the job restartable by making Restarable = "true"

job id = "jobName" xmlns = "http://www.springframework.org/schema/batch" restartable = "true"

2. Code to restart the task

 import java.util.Date; import java.util.List; import org.apache.commons.collections.CollectionUtils; import org.springframework.batch.core.BatchStatus; import org.springframework.batch.core.ExitStatus; import org.springframework.batch.core.JobExecution; import org.springframework.batch.core.JobInstance; import org.springframework.batch.core.explore.JobExplorer; import org.springframework.batch.core.launch.JobLauncher; import org.springframework.batch.core.launch.JobOperator; import org.springframework.batch.core.repository.JobRepository; import org.springframework.beans.factory.annotation.Autowired; public class ResartJob { @Autowired private JobExplorer jobExplorer; @Autowired JobRepository jobRepository; @Autowired private JobLauncher jobLauncher; @Autowired JobOperator jobOperator; public void restart(){ try { List<JobInstance> jobInstances = jobExplorer.getJobInstances("jobName",0,1);// this will get one latest job from the database if(CollectionUtils.isNotEmpty(jobInstances)){ JobInstance jobInstance = jobInstances.get(0); List<JobExecution> jobExecutions = jobExplorer.getJobExecutions(jobInstance); if(CollectionUtils.isNotEmpty(jobExecutions)){ for(JobExecution execution: jobExecutions){ // If the job status is STARTED then update the status to FAILED and restart the job using JobOperator.java if(execution.getStatus().equals(BatchStatus.STARTED)){ execution.setEndTime(new Date()); execution.setStatus(BatchStatus.FAILED); execution.setExitStatus(ExitStatus.FAILED); jobRepository.update(execution); jobOperator.restart(execution.getId()); } } } } } catch (Exception e1) { e1.printStackTrace(); } } } 

3.

 <bean id="jobRepository" class="org.springframework.batch.core.repository.support.JobRepositoryFactoryBean" p:dataSource-ref="dataSource" p:transactionManager-ref="transactionManager" p:lobHandler-ref="oracleLobHandler"/> <bean id="oracleLobHandler" class="org.springframework.jdbc.support.lob.DefaultLobHandler"/> <bean id="jobExplorer" class="org.springframework.batch.core.explore.support.JobExplorerFactoryBean" p:dataSource-ref="dataSource" /> <bean id="jobRegistry" class="org.springframework.batch.core.configuration.support.MapJobRegistry" /> <bean id="jobLauncher" class="org.springframework.batch.core.launch.support.SimpleJobLauncher"> <property name="jobRepository" ref="jobRepository" /> <property name="taskExecutor" ref="jobLauncherTaskExecutor" /> </bean> <task:executor id="jobLauncherTaskExecutor" pool-size="6" rejection-policy="ABORT" /> <bean id="jobOperator" class="org.springframework.batch.core.launch.support.SimpleJobOperator" p:jobLauncher-ref="jobLauncher" p:jobExplorer-re`enter code here`f="jobExplorer" p:jobRepository-ref="jobRepository" p:jobRegistry-ref="jobRegistry"/> 
+2
source

All Articles