Erstellen Sie einen einfachen Spring Batch und starten Sie ihn im Batch von einer Webanforderung.
Um SpringBatch zu verwenden, fügen Sie der Abhängigkeit "Spring-Boot-Starter-Batch" hinzu. Da DB für die Jobverwaltung verwendet wird, wird auch ein geeigneter JDBC hinzugefügt.
pom.xml
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-batch</artifactId>
</dependency>
<dependency>
<groupId>org.postgresql</groupId>
<artifactId>postgresql</artifactId>
<scope>runtime</scope>
</dependency>
** Grundsätzlich erstellt unter Bezugnahme auf hier **
Erstellen Sie eine entsprechende Verarbeitungsklasse als "@ Service"
@Service
public class MyBatchService {
public void execute(Long id, String name, Date reqDate) throws InterruptedException {
//Angemessene Stapelverarbeitung
Thread.sleep(5000);
}
}
Das Herzstück der Stapelverarbeitung. Erstellen Sie dieses Mal ganz einfach einen Ein-Schritt-Job (Tasklet). In der Java-Konfigurationsklasse festlegen.
@Configuration
@EnableBatchProcessing //(1)
public class BatchConfig {
@Autowired
private JobBuilderFactory jobBuilderFactory; //(2)
@Autowired
private StepBuilderFactory stepBuilderFactory; //(2)
@Autowired
private MyBatchService service;
@Bean
public JobLauncher jobLauncher1(JobRepository jobRepository) { //(2),(3)
ThreadPoolTaskExecutor taskExecutor = new ThreadPoolTaskExecutor();
//Die Anzahl der gleichzeitigen Ausführungen beträgt 3.Warten Sie auf weitere Warteschlangen.
taskExecutor.setCorePoolSize(3); //(4)
// java.lang.IllegalStateException: ThreadPoolTaskExecutor not initialized
taskExecutor.initialize(); //(5)
SimpleJobLauncher jobLauncher = new SimpleJobLauncher();
jobLauncher.setJobRepository(jobRepository);
jobLauncher.setTaskExecutor(taskExecutor);
return jobLauncher;
}
@Bean
public Job job(Step step1) { //(6)
return jobBuilderFactory.get("batchjob")
.incrementer(new RunIdIncrementer())
.start(step1)
.build();
}
@Bean
public Step step1(Tasklet tasklet1) { //(6)
return stepBuilderFactory.get("step1")
.tasklet(tasklet1)
.build();
}
@Bean
@StepScope //(7)
public Tasklet tasklet1( //(6)
@Value("#{jobParameters['id']}") Long id, //(8)
@Value("#{jobParameters['name']}") String name,
@Value("#{jobParameters['reqDate']}") Date reqDate
) {
//(9)
MethodInvokingTaskletAdapter tasklet = new MethodInvokingTaskletAdapter();
tasklet.setTargetObject(service);
tasklet.setTargetMethod("execute");
tasklet.setArguments(new Object[] {id, name, reqDate});
return tasklet;
}
}
(1) | Zeigt an, dass es sich um eine Spring Batch-Einstellung handelt@EnableBatchProcessing Zu@Configuration Grant mit. |
(2) | Einige Beans sind standardmäßig im Kontext enthalten und können automatisch verdrahtet werden. |
(3) | Einstellungen für die Jobausführungsumgebung. |
(4) | Anzahl der gleichzeitigen Ausführungen mit CorePoolSize(Anzahl der Themen)Einstellen. Wenn dies überschritten wird, wartet es auf eine Warteschlange und wird nacheinander ausgeführt, sobald Threads verfügbar werden. |
(5) | Ich muss initialisieren"java.lang.IllegalStateException: ThreadPoolTaskExecutor not initialized"Ausnahme tritt auf. |
(6) | Job, Step,Tasklet-Einstellungen. |
(7) | Wenn Sie die Parameter zur Laufzeit festlegen, können Sie beim Start keine Bean erstellen.@StepScope So ändern Sie den Zeitpunkt der Bean-Erstellung. |
(8) | Einstellungen zum Abrufen von Objekten aus jobParameters. |
(9) | Mit Invoke ausführen. |
@Service
public class MyServletService {
@Autowired
private JobLauncher jobLauncher1;
@Autowired
private Job job;
public void request(Long id, String name) throws JobExecutionException {
// (10)
JobParameters params = new JobParametersBuilder()
.addLong("id", id)
.addString("name", name)
.addDate("reqDate", Calendar.getInstance().getTime())
.toJobParameters();
jobLauncher1.run(job, params);
}
}
(10) | Die an Job zu übergebenden Parameter werden gemeinsam an JobParameters übergeben. |
Fügen Sie der application.yml Einstellungen hinzu.
application.yml
spring:
datasource: # (11)
url: jdbc:postgresql://localhost:5432/kurukuruz1
username: u-s-e-r
password: p-a-s-s
driver-class-name: org.postgresql.Driver
batch:
initialize-schema: always # (12)
job:
enabled: false # (13)
(11) | Legen Sie die Verbindungsinformationen der zu verwendenden Datenbank fest. |
(12) | Einstellungen zum Ausführen von DDL für die von Spring Batch verwendeten Tabellen. Standardmäßigembedded Wenn Sie PostgreSQL verwenden, wird DDL nicht ausgeführt. Ändern Sie es daher explizit. |
(13) | Standardmäßigtrue Der Job wird ausgeführt, wenn Spring gestartet wird, kann jedoch beim Start nicht ausgeführt werden, da beim Start keine Jobparameter vorhanden sind. Ändern Sie es daher explizit. |
Wiedereinführung von Spring Batch - Ich habe versucht, die Verwendung selbst zu organisieren - Qiita BLOG.IK.AM - Falsch missverstandene ThreadPoolTaskExecutor-Einstellungen Spring Batch-Beispielcode (Java / Gradle) - Qoosky [Spring Batch] Job nicht automatisch ausführen Steuermethode, wenn andere Jobs als der angegebene Job automatisch ausgeführt werden --Qiita Kojioniruku-Hallo Welt bei Spring Boot Batch
Recommended Posts