[JAVA] Créez un lot à la demande simple avec Spring Batch

Abstrait

Créez un Spring Batch simple et lancez-le par lots à partir d'une requête Web.

environnement

Procédure détaillée

Création de projet

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>

Création de lots

** Fondamentalement créé en faisant référence à ici **

Traitement réel par lots

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);
	}
}

Paramétrage des lots

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À@ConfigurationAccorder 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.@StepScopePour 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.

Appel par lots

@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.

Paramètres de démarrage

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éfautembeddedAinsi, lorsque vous utilisez PostgreSQL, DDL n'est pas exécuté, modifiez-le donc explicitement.
(13) Par défauttrueLe 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.

Site de référence

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

Créez un lot à la demande simple avec Spring Batch
Créez une application de recherche simple avec Spring Boot
Créez un site de démonstration simple avec Spring Security avec Spring Boot 2.1
Créez une application Web simple avec Dropwizard
[Retrait des rails] Créez une fonction de retrait simple avec des rails
Créer un graphique à barres simple avec MPAndroidChart
Créez un tableau d'affichage simple avec Java + MySQL
Créez un cadre de traitement par lots simple dans Eclipse.
Créer un serveur API Web avec Spring Boot
Créer un environnement de développement Spring Boot avec docker
Implémentez une API Rest simple avec Spring Security avec Spring Boot 2.0
Créez un terrain de jeu avec Xcode 12
Créer un micro service avec Spring Boot
Créez un CRUD simple avec SpringBoot + JPA + Thymeleaf ③ ~ Ajouter une validation ~
Créez une application Web Hello World avec Spring Framework + Jetty
Faisons une API simple avec EC2 + RDS + Spring boot ①
Implémentez une API Rest simple avec Spring Security & JWT avec Spring Boot 2.0
Créez un environnement Vue3 avec Docker!
Créez une application avec Spring Boot 2
Créez une application avec Spring Boot
Créez des exceptions avec une interface fluide
Implémentez un serveur API Web REST simple avec Spring Boot + MySQL
Créez un serveur Web simple avec la bibliothèque standard Java com.sun.net.httpserver
Créez un CRUD simple avec SpringBoot + JPA + Thymeleaf ④ ~ Personnaliser le message d'erreur ~
J'ai créé un formulaire de recherche simple avec Spring Boot + GitHub Search API.
Créez un fichier jar avec la commande
[Rails6] Créer une nouvelle application avec Rails [Débutant]
Créer un environnement de développement Spring Boot-gradle-mysql avec Docker
Créez une classe temporaire avec le nouvel Object () {}
[docker] [nginx] Créer un ALB simple avec nginx
[Rails 5] Créer une nouvelle application avec Rails [Débutant]
Créez un projet de développement d'application Spring Boot avec la commande cURL + tar
Créez un CRUD simple avec SpringBoot + JPA + Thymeleaf ② ~ Création d'écran et de fonctions ~
Exécutable serveur avec Spring gradle Comment créer JAR et WAR
Créez un serveur de passerelle simple en définissant masquerade avec firewall-cmd de CentOS8
Étapes pour créer une application chameau simple avec les démarreurs Apache Camel Spring Boot
[Memo] Créez facilement un environnement CentOS 8 avec Docker
Créer un CSR avec des informations étendues en Java
[Rails] rails nouveau pour créer une base de données avec PostgreSQL
[Windows] [IntelliJ] [Java] [Tomcat] Créer un environnement pour Tomcat 9 avec IntelliJ
Créons un processus chronométré avec la minuterie de Java! !!
[Tutoriel] Spring Batch
Créez une application Spring Boot à l'aide d'IntelliJ IDEA
[Java] Créer une collection avec un seul élément
Créez une discussion d'équipe avec Rails Action Cable
Mettre à jour périodiquement la base de données avec Spring Batch et My Batis
Créez une application CRUD avec Spring Boot 2 + Thymeleaf + MyBatis
Créer un compte SandBox avec IP Fastlane Spaces
Créer une carte multi-touches avec une bibliothèque standard
Créez votre propre utilitaire avec Thymeleaf avec Spring Boot
Comment créer un formulaire Excel à l'aide d'un fichier modèle avec Spring MVC
Afficher un simple Hello World avec SpringBoot + IntelliJ
Créer un environnement Spring Boot avec Windows + VS Code
Un simple jeu de ciseaux-papier-pierre avec JavaFX et SceneBuilder
Création d'un référentiel commun avec Spring Data JPA
Construisez un système WEB avec Spring + Doma + H2DB