[JAVA] J'ai essayé Spring Batch

Aperçu

Je garderai un mémorandum lors de l'utilisation de Spring Batch avec STS. Principalement pour moi. Spring Batch est un framework d'application par lots basé sur Spring Framework.

L'environnement de développement est le suivant. OS : Windows 7 Home Edition 64bit Java : JavaSE 8 update 181 Spring Boot : 2.3.4 STS : 4.6.1

Configuration STS

Pour la configuration du STS, j'ai fait référence à Mon mémorandum.

Créer un projet

Cliquez sur Créer un nouveau projet Spring Starter ci-dessous. createProject.PNG

Définissez le projet. NewSpringStarterProject.PNG

Définissez une référence de bibliothèque. dependencies.PNG

Les informations du site sont définies, aucun changement. siteInfo.PNG

Le projet est terminé. ProjectExplorer.PNG

Remarques

À propos de Lombok

Seul Lombok télécharge le pot et Sélectionnez et installez le STS utilisé dans le programme d'installation. Le programme d'installation peut être téléchargé depuis Lombok Official. Parce que Lombok fait référence au projet L'utilisation d'annotations ne provoque pas d'erreur de compilation, getter / setter, le constructeur n'est pas généré automatiquement, Tenter de les appeler entraînera une erreur de compilation. Puisque getter / setter etc. doit être automatiquement généré par l'EDI, Vous devez également l'installer sur STS.

Installation du pilote Oracle

DB n'est pas utilisé dans cet article, La configuration de Spring Boot + Spring Batch suppose l'utilisation de DB. Par conséquent, dans application.properties et application.yml Les informations de connexion à la base de données ne sont pas décrites, En premier lieu, il n'y a pas de pilote Oracle Lorsque vous exécutez l'application Impossible d'exécuter avec l'erreur que __datasource est requis. __ Par conséquent, à Oracle qui a été configuré sur le PC dont le fonctionnement a été confirmé Je fais référence à la bibliothèque pour pouvoir me connecter. De plus, il peut être exécuté sans démarrer __DB au moment de l'exécution __. Si vous avez une bibliothèque et que vous avez une configuration et des paramètres qui tentent de se connecter au schéma de base de données C'est bon.

Créer une application par lots

Le démarrage officiel de Spring Batch est ici. Dans le cas ci-dessus, il s'agit d'une spécification pour exécuter le fichier jar créé et charger les données csv dans la table DB.

Dans cet article, je vais essayer de planifier le traitement par lots sans utiliser cron. J'ai fait référence aux tâches de planification de Spring Batch @Scheduled documentation.

À titre d'exemple, créons un bean et implémentons un processus pour enregistrer son contenu. Voir Lombok pour omettre les déclarations de variables pour la sortie du journal et les plaques chauffantes pour les classes de haricots.

Les classes implémentées sont les suivantes.

Tout d'abord, la classe avec @SpringBootApplication, Cette classe est spécifiée au moment de l'exécution.

BatchSampleApplication.java


package jp.co.illmatics;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;

@SpringBootApplication
public class BatchSampleApplication {

	public static void main(String[] args) {
		SpringApplication.run(BatchSampleApplication.class, args);
	}

}

Il s'agit de la routine principale du traitement par lots. En spécifiant @EnableScheduling La planification par lots est désormais possible La méthode qui a spécifié @Scheduled cron = "${cron.pattern1}" Il sera exécuté au moment spécifié dans.

Batch.java


package jp.co.illmatics;

import org.springframework.context.annotation.Configuration;
import org.springframework.scheduling.annotation.EnableScheduling;
import org.springframework.scheduling.annotation.Scheduled;

import jp.co.illmatics.bean.Member;
import jp.co.illmatics.enumeration.VoicePart;
import lombok.extern.slf4j.Slf4j;

@Configuration
@EnableScheduling
@Slf4j
public class Batch {

	private String firstName = "Dummy";
	private String familyName = "Family";
	private String part = VoicePart.LEAD_VOCAL.toString();
	private String birthday = "1991/01/01";

	@Scheduled(cron = "${cron.pattern1}")
	public void execute() {
		Member member = new Member(firstName, familyName, part, birthday);
		log.info("member = " + member.toString());
	}

}

C'est un fichier de ressources. Utilisez la clé cron.pattern1 pour définir la synchronisation d'exécution du traitement par lots Il est spécifié toutes les minutes et toutes les 0 secondes. Veuillez consulter le Document officiel de l'API pour le format.

application.properties


spring.datasource.driver-class-name=oracle.jdbc.driver.OracleDriver
spring.datasource.url=jdbc:oracle:thin:@localhost:1521:XE
spring.datasource.username=xxxxxx
spring.datasource.password=xxxxxx
spring.jpa.database-platform=org.hibernate.dialect.Oracle10gDialect
spring.jpa.show-sql=true

cron.pattern1: 0 * * * * *

Bean pour les données de test. Nous validons à l'aide de Bean Validation. Parmi eux, nous avons implémenté @ExistsInVoicePrat en tant que validation personnalisée.

Member.java


package jp.co.illmatics.bean;

import javax.validation.constraints.NotEmpty;

import org.springframework.format.annotation.DateTimeFormat;

import jp.co.illmatics.validator.annotation.ExistsInVoicePart;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.extern.slf4j.Slf4j;

@Data
@AllArgsConstructor
public class Member {

	@NotEmpty(message = "Input first name.")
	private String firstName;

	@NotEmpty(message = "Input family name.")
	private String familyName;

	@ExistsInVoicePart
	private String part;

	@DateTimeFormat(pattern = "yyyy/MM/dd")
	private String birthday;

}

Une annotation pour une validation personnalisée.

ExistsInVoicePart.java


package jp.co.illmatics.validator.annotation;

import static java.lang.annotation.ElementType.FIELD;
import static java.lang.annotation.RetentionPolicy.RUNTIME;

import java.lang.annotation.Retention;
import java.lang.annotation.Target;

import javax.validation.Constraint;
import javax.validation.Payload;

import jp.co.illmatics.validator.VoicePartValidator;

@Constraint(validatedBy = {VoicePartValidator.class})
@Target({FIELD})
@Retention(RUNTIME)
public @interface ExistsInVoicePart {

	String message() default "Input voice part.";
    Class<?>[] groups() default {};
    Class<? extends Payload>[] payload() default {};
    
    @Target({FIELD})
    @Retention(RUNTIME)
    public @interface List {
        ExistsInVoicePart[] value();
    }

}

Énumération pour les validateurs personnalisés.

VoicePart.java


package jp.co.illmatics.enumeration;

public enum VoicePart {

	LEAD_VOCAL("lead vocal"),
	BEATBOXER("beatboxer"),
	BASS("bass"),
	OTHERS("others");

    @SuppressWarnings("unused")
	private final String name;
 
    private VoicePart(String name) {
        this.name = name;
    }
}

Validateur personnalisé.

VoicePartValidator.java


package jp.co.illmatics.validator;

import java.util.Arrays;

import javax.validation.ConstraintValidator;
import javax.validation.ConstraintValidatorContext;

import jp.co.illmatics.enumeration.VoicePart;
import jp.co.illmatics.validator.annotation.ExistsInVoicePart;

public class VoicePartValidator implements ConstraintValidator<ExistsInVoicePart, String> {

	public void initialize(ExistsInVoicePart annotation) {
	}

	@Override
	public boolean isValid(String value, ConstraintValidatorContext context) {
		return Arrays.stream(VoicePart.values()).filter(part -> part.name().equals(value)).findFirst().isPresent();
	}
}

Contrôle de fonctionnement

Cliquez avec le bouton droit sur BatchSampleApplication.java, Exécuter en tant qu'application Spring Boot.

Il s'exécute toutes les 0 secondes toutes les minutes. 実行結果.PNG

c'est tout. Jusqu'à la fin Merci d'avoir lu.

Recommended Posts

J'ai essayé Spring Batch
J'ai essayé Spring.
J'ai essayé la machine Spring State
J'ai essayé d'utiliser Spring + Mybatis + DbUnit
J'ai essayé GraphQL avec Spring Boot
J'ai essayé Flyway avec Spring Boot
[Tutoriel] Spring Batch
J'ai essayé de mettre Tomcat
J'ai essayé youtubeDataApi.
J'ai essayé de refactoriser ①
J'ai essayé FizzBuzz.
J'ai essayé JHipster 5.1
J'ai essayé l'initialisation paresseuse avec Spring Boot 2.2.0
J'ai essayé Spring Data JDBC 1.0.0.BUILD-SNAPSHOT (-> 1.0.0.RELEASE)
J'ai essayé d'exécuter Autoware
J'ai essayé d'utiliser Gson
J'ai essayé QUARKUS immédiatement
J'ai essayé d'utiliser TestNG
J'ai essayé d'utiliser Galasa
J'ai essayé node-jt400 (Programmes)
J'ai essayé de lier JavaFX et Spring Framework.
J'ai essayé node-jt400 (exécuter)
Résumé de ce que j'ai appris dans Spring Batch
J'ai essayé node-jt400 (Transactions)
05. J'ai essayé de supprimer la source de Spring Boot
J'ai essayé de réduire la capacité de Spring Boot
J'ai essayé de démarrer avec Spring Data JPA
Paramètres de lancement de tâche Spring Batch
J'ai essayé node-jt400 (Construction de l'environnement)
J'ai essayé DI avec Ruby
J'ai essayé node-jt400 (écriture IFS)
J'ai essayé node-jt400 (mise à jour SQL)
J'ai essayé d'utiliser azure cloud-init
J'ai essayé Drools (Java, InputStream)
J'ai essayé Rails débutant [Chapitre 1]
J'ai essayé d'utiliser Apache Wicket
J'ai essayé node-jt400 (requête SQL)
J'ai essayé d'utiliser Java REPL
J'ai essayé l'analyse du code source
J'ai essayé le problème FizzBuzz
J'ai essayé node-jt400 (flux SQL)
J'ai essayé node-jt400 (lecture IFS)
J'ai essayé Rails débutant [Chapitre 2]
J'ai essayé UPSERT avec PostgreSQL.
J'ai essayé BIND avec Docker
J'ai essayé de vérifier yum-cron
Étape de boucle avec Spring Batch
J'ai essayé la métaprogrammation avec Java
J'ai essayé le guide d'introduction de Spring Boot [Accès aux données avec JPA]
J'ai essayé de vérifier ceci et celui de Spring @ Transactional
[Rails] J'ai essayé d'implémenter le traitement par lots avec la tâche Rake
J'ai essayé de démarrer avec Swagger en utilisant Spring Boot
J'ai essayé d'utiliser anakia + Jing maintenant
J'ai essayé d'imprimer un formulaire avec Spring MVC et Jasper Reports 1/3 (paramètres Jasper Reports)
J'ai essayé le didacticiel Angular + SpringBoot + PostgreSQL
J'ai essayé d'imprimer un formulaire avec Spring MVC et Jasper Reports 3/3 (contrôle Spring MVC)
J'ai essayé de mâcher C # (indexeur)