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
Pour la configuration du STS, j'ai fait référence à Mon mémorandum.
Cliquez sur Créer un nouveau projet Spring Starter ci-dessous.
Définissez le projet.
Définissez une référence de bibliothèque.
Les informations du site sont définies, aucun changement.
Le projet est terminé.
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.
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.
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();
}
}
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.
c'est tout. Jusqu'à la fin Merci d'avoir lu.
Recommended Posts