Créez un Spring Batch simple et lancez-le par lots à partir d'une requête Web.
Ajoutez spring-boot-starter-batch
à la dépendance pour utiliser SpringBatch.
De plus, étant donné que DB est utilisé pour la gestion des travaux, un JDBC approprié est également ajouté.
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>
** Fondamentalement créé en faisant référence à ici **
Créez une classe de traitement appropriée en tant que @ Service
@Service
public class MyBatchService {
public void execute(Long id, String name, Date reqDate) throws InterruptedException {
//Traitement par lots approprié
Thread.sleep(5000);
}
}
Le cœur du traitement par lots. Cette fois, créez facilement une tâche (tasklet) en une seule étape. Défini dans la classe de configuration Java.
@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();
//Le nombre d'exécutions simultanées est de 3.Attendez plus de files d'attente.
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) | Indique qu'il s'agit d'un paramètre Spring Batch@EnableBatchProcessing À@Configuration Accorder avec. |
(2) | Certains beans sont inclus dans le contexte par défaut et peuvent être câblés automatiquement. |
(3) | Paramètres d'environnement d'exécution des travaux. |
(4) | Nombre d'exécutions simultanées avec CorePoolSize(Le nombre de fils)Mettre en place. S'il dépasse cela, il attendra une file d'attente et sera exécuté séquentiellement dès que les threads seront disponibles. |
(5) | Je dois initialiser"java.lang.IllegalStateException: ThreadPoolTaskExecutor not initialized"Une exception se produit. |
(6) | Job, Step,Paramètres du Tasklet. |
(7) | Si vous définissez les paramètres lors de l'exécution, vous ne pouvez pas créer de bean au démarrage.@StepScope Pour changer le moment de la création du haricot. |
(8) | Paramètres pour récupérer les objets de jobParameters. |
(9) | Exécutez avec Invoke. |
@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) | Les paramètres à transmettre à Job sont collectivement transmis à JobParameters. |
Ajoutez des paramètres à application.yml.
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) | Définissez les informations de connexion du DB à utiliser. |
(12) | Paramètres d'exécution de DDL sur les tables utilisées par Spring Batch. Par défautembedded Ainsi, lorsque vous utilisez PostgreSQL, DDL n'est pas exécuté, modifiez-le donc explicitement. |
(13) | Par défauttrue Le travail est exécuté au démarrage de Spring, mais il ne peut pas être exécuté au démarrage car il n'y a pas de paramètres de travail au démarrage. Par conséquent, modifiez-le explicitement. |
Réintroduction de Spring Batch - J'ai essayé d'organiser comment l'utiliser moi-même - Qiita BLOG.IK.AM - Paramètres ThreadPoolTaskExecutor mal compris Exemple de code Spring Batch (Java / Gradle) --Qoosky [Spring Batch] Ne pas exécuter automatiquement la méthode de contrôle du travail lorsque des travaux autres que le travail spécifié sont exécutés automatiquement --Qiita Kojioniruku-Hello World à Spring Boot Batch
Recommended Posts