Skip to content

Commit fc47374

Browse files
committed
#BAEL-8695: add main source
1 parent 5daaf34 commit fc47374

File tree

2 files changed

+130
-0
lines changed

2 files changed

+130
-0
lines changed
Lines changed: 72 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,72 @@
1+
package com.baeldung.restartjob;
2+
3+
import org.springframework.batch.core.Job;
4+
import org.springframework.batch.core.Step;
5+
import org.springframework.batch.core.configuration.annotation.StepScope;
6+
import org.springframework.batch.core.job.builder.JobBuilder;
7+
import org.springframework.batch.core.repository.JobRepository;
8+
import org.springframework.batch.core.step.builder.StepBuilder;
9+
import org.springframework.batch.item.ItemProcessor;
10+
import org.springframework.batch.item.ItemWriter;
11+
import org.springframework.batch.item.file.FlatFileItemReader;
12+
import org.springframework.batch.item.file.builder.FlatFileItemReaderBuilder;
13+
import org.springframework.batch.item.file.mapping.PassThroughLineMapper;
14+
import org.springframework.context.annotation.Bean;
15+
import org.springframework.context.annotation.Configuration;
16+
import org.springframework.core.io.ClassPathResource;
17+
import org.springframework.transaction.PlatformTransactionManager;
18+
19+
@Configuration
20+
public class BatchConfig {
21+
22+
@Bean
23+
public Job simpleJob(JobRepository jobRepository, PlatformTransactionManager transactionManager) {
24+
return new JobBuilder("simpleJob", jobRepository)
25+
.start(step1(jobRepository, transactionManager))
26+
.build();
27+
}
28+
29+
@Bean
30+
public Step step1(JobRepository jobRepository, PlatformTransactionManager transactionManager) {
31+
return new StepBuilder("step1", jobRepository)
32+
.<String, String>chunk(2, transactionManager)
33+
.reader(flatFileItemReader())
34+
.processor(itemProcessor())
35+
.writer(itemWriter())
36+
.build();
37+
}
38+
39+
@Bean
40+
@StepScope
41+
public FlatFileItemReader<String> flatFileItemReader() {
42+
return new FlatFileItemReaderBuilder<String>()
43+
.name("itemReader")
44+
.resource(new ClassPathResource("data.csv"))
45+
.lineMapper(new PassThroughLineMapper())
46+
.saveState(true)
47+
.build();
48+
}
49+
50+
@Bean
51+
public ItemProcessor<String, String> itemProcessor() {
52+
return item -> {
53+
System.out.println("Processing: " + item);
54+
55+
if (item.equals("Item3")) {
56+
throw new RuntimeException("Simulated failure on Item3");
57+
}
58+
59+
return "PROCESSED " + item;
60+
};
61+
}
62+
63+
@Bean
64+
public ItemWriter<String> itemWriter() {
65+
return items -> {
66+
System.out.println("Writing items:");
67+
for (String item : items) {
68+
System.out.println("- " + item);
69+
}
70+
};
71+
}
72+
}
Lines changed: 58 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,58 @@
1+
package com.baeldung.restartjob;
2+
3+
import java.util.List;
4+
5+
import org.springframework.batch.core.BatchStatus;
6+
import org.springframework.batch.core.Job;
7+
import org.springframework.batch.core.JobExecution;
8+
import org.springframework.batch.core.JobInstance;
9+
import org.springframework.batch.core.JobParameters;
10+
import org.springframework.batch.core.JobParametersBuilder;
11+
import org.springframework.batch.core.explore.JobExplorer;
12+
import org.springframework.batch.core.launch.JobLauncher;
13+
import org.springframework.batch.core.launch.JobOperator;
14+
import org.springframework.boot.CommandLineRunner;
15+
import org.springframework.boot.SpringApplication;
16+
import org.springframework.boot.autoconfigure.SpringBootApplication;
17+
import org.springframework.context.annotation.Bean;
18+
19+
@SpringBootApplication
20+
public class RestartJobBatchApp {
21+
22+
public static void main(String[] args) {
23+
SpringApplication app = new SpringApplication(RestartJobBatchApp.class);
24+
app.setAdditionalProfiles("restart");
25+
app.run(args);
26+
}
27+
28+
@Bean
29+
CommandLineRunner run(JobLauncher jobLauncher, Job job, JobExplorer jobExplorer, JobOperator jobOperator) {
30+
return args -> {
31+
JobParameters jobParameters = new JobParametersBuilder()
32+
.addString("jobId", "test-job-" + System.currentTimeMillis())
33+
.toJobParameters();
34+
35+
List<JobInstance> instances = jobExplorer.getJobInstances("simpleJob", 0, 1);
36+
if (!instances.isEmpty()) {
37+
JobInstance lastInstance = instances.get(0);
38+
List<JobExecution> executions = jobExplorer.getJobExecutions(lastInstance);
39+
if (!executions.isEmpty()) {
40+
JobExecution lastExecution = executions.get(0);
41+
if (lastExecution.getStatus() == BatchStatus.FAILED) {
42+
System.out.println("Restarting failed job execution with ID: " + lastExecution.getId());
43+
44+
final Long restartId = jobOperator.restart(lastExecution.getId());
45+
final JobExecution restartedExecution = jobExplorer.getJobExecution(restartId);
46+
47+
System.out.println("Restarted job status: " + restartedExecution.getStatus());
48+
return;
49+
}
50+
}
51+
}
52+
53+
System.out.println("Starting new job execution...");
54+
JobExecution jobExecution = jobLauncher.run(job, jobParameters);
55+
System.out.println("Job started with status: " + jobExecution.getStatus());
56+
};
57+
}
58+
}

0 commit comments

Comments
 (0)