Java >> Java Tutorial >  >> Tag >> Spring

Spring Batch Tutorial:Erstellen eines benutzerdefinierten ItemReader

Spring Batch bietet eine gute Unterstützung zum Lesen der Eingabedaten eines Batch-Jobs aus verschiedenen Datenquellen wie Dateien (CSV, XML) und Datenbanken.

Es kommt jedoch häufig vor, dass Sie die Eingabedaten aus einer Datenquelle lesen müssen, die standardmäßig nicht unterstützt wird. Das bedeutet, dass Sie eine Komponente implementieren müssen, die die Eingabedaten aus Ihrer Datenquelle liest.

Dieser Blogbeitrag hilft Ihnen, dieses Problem zu lösen. Nachdem Sie diesen Blogbeitrag gelesen haben, werden Sie:

  • Verstehen Sie, wie Sie einen benutzerdefinierten ItemReader implementieren können .
  • Wissen Sie, wie Sie ItemReader konfigurieren können Bean, die die Eingabedaten für Ihren Batch-Job bereitstellt.

Fangen wir an.

Erstellen eines benutzerdefinierten ItemReader

Sie können einen benutzerdefinierten ItemReader erstellen indem Sie diesen Schritten folgen:

Zuerst müssen Sie eine Klasse erstellen, die ItemReader<T> implementiert Schnittstelle und geben Sie den Typ des zurückgegebenen Objekts als Typparameter an.

Zweiter , müssen Sie den T read() implementieren Methode des ItemReader<T> Schnittstelle, indem Sie diese Regeln befolgen:

  • Der read() -Methode gibt ein Objekt zurück, das die Informationen des nächsten Elements enthält.
  • Wenn der nächste Artikel nicht gefunden wird, der read() Methode muss null zurückgeben .

Lassen Sie uns einen benutzerdefinierten ItemReader erstellen das die Studenteninformationen eines Online-Testkurses als StudentDTO zurückgibt Objekte, die aus dem Speicher gelesen werden.

Die StudentDTO Klasse ist ein einfaches Datenübertragungsobjekt und ihr Quellcode sieht wie folgt aus:

public class StudentDTO {
  
    private String emailAddress;
    private String name;
    private String purchasedPackage;
  
    public StudentDTO() {}
  
    public String getEmailAddress() {
        return emailAddress;
    }
  
    public String getName() {
        return name;
    }
  
    public String getPurchasedPackage() {
        return purchasedPackage;
    }
  
    public void setEmailAddress(String emailAddress) {
        this.emailAddress = emailAddress;
    }
  
    public void setName(String name) {
        this.name = name;
    }
  
    public void setPurchasedPackage(String purchasedPackage) {
        this.purchasedPackage = purchasedPackage;
    }
}

Sie können Ihren ItemReader implementieren indem Sie diesen Schritten folgen:

Zuerst müssen Sie eine Klasse erstellen, die ItemReader<T> implementiert Schnittstelle und geben Sie den Typ des Objekts an, das von T read() zurückgegeben wird Methode. Nachdem Sie diese Klasse erstellt haben, sieht ihr Quellcode wie folgt aus:

import org.springframework.batch.item.ItemReader;

public class InMemoryStudentReader implements ItemReader<StudentDTO> {
}

Zweiter müssen Sie die Eingabedaten initialisieren, die von Ihrem ItemReader zurückgegeben werden . Sie können Ihre Eingabedaten initialisieren, indem Sie diesen Schritten folgen:

  1. Fügen Sie einen List<Student> hinzu Feld zu Ihrem ItemReader Klasse. Dieses Feld enthält die Studenteninformationen des Kurses.
  2. Fügen Sie einen int hinzu Feld namens nextStudentIndex zu Ihrem ItemReader Klasse. Dieses Feld enthält den Index des nächsten StudentDTO Objekt, das von Ihrem ItemReader zurückgegeben wird .
  3. Fügen Sie einen privaten initialize() hinzu Methode zu Ihrem ItemReader Klasse. Diese Methode erstellt die Schülerdaten und setzt den Index des nächsten Schülers auf 0.
  4. Erstellen Sie einen Konstruktor, der initialize() aufruft Methode.

Nachdem Sie Ihre Eingabedaten initialisiert haben, wird der Quellcode Ihres ItemReader Klasse sieht wie folgt aus:

import org.springframework.batch.item.ItemReader;

import java.util.Arrays;
import java.util.Collections;
import java.util.List;

public class InMemoryStudentReader implements ItemReader<StudentDTO> {

    private int nextStudentIndex;
    private List<StudentDTO> studentData;

    InMemoryStudentReader() {
        initialize();
    }

    private void initialize() {
        StudentDTO tony = new StudentDTO();
        tony.setEmailAddress("[email protected]");
        tony.setName("Tony Tester");
        tony.setPurchasedPackage("master");

        StudentDTO nick = new StudentDTO();
        nick.setEmailAddress("[email protected]");
        nick.setName("Nick Newbie");
        nick.setPurchasedPackage("starter");

        StudentDTO ian = new StudentDTO();
        ian.setEmailAddress("[email protected]");
        ian.setName("Ian Intermediate");
        ian.setPurchasedPackage("intermediate");

        studentData = Collections.unmodifiableList(Arrays.asList(tony, nick, ian));
        nextStudentIndex = 0;
    }
}

Dritter , müssen Sie den read() implementieren Methode des ItemReader Schnittstelle, indem Sie diese Regeln befolgen:

  • Wenn der nächste Schüler gefunden wird, geben Sie den gefundenen StudentDTO zurück Objekt und erhöhen Sie den Wert von nextStudentIndex Feld um 1.
  • Wenn der nächste Schüler nicht gefunden wird, setzen Sie den Wert von nextStudentIndex Feld auf 0.
  • Wenn der nächste Schüler nicht gefunden wird, geben Sie null zurück .

Nachdem Sie den read() implementiert haben Methode, den Quellcode Ihres ItemReader Klasse sieht wie folgt aus:

import org.springframework.batch.item.ItemReader;

import java.util.Arrays;
import java.util.Collections;
import java.util.List;

public class InMemoryStudentReader implements ItemReader<StudentDTO> {

    private int nextStudentIndex;
    private List<StudentDTO> studentData;

    InMemoryStudentReader() {
        initialize();
    }

    private void initialize() {
        StudentDTO tony = new StudentDTO();
        tony.setEmailAddress("[email protected]");
        tony.setName("Tony Tester");
        tony.setPurchasedPackage("master");

        StudentDTO nick = new StudentDTO();
        nick.setEmailAddress("[email protected]");
        nick.setName("Nick Newbie");
        nick.setPurchasedPackage("starter");

        StudentDTO ian = new StudentDTO();
        ian.setEmailAddress("[email protected]");
        ian.setName("Ian Intermediate");
        ian.setPurchasedPackage("intermediate");

        studentData = Collections.unmodifiableList(Arrays.asList(tony, nick, ian));
        nextStudentIndex = 0;
    }

    @Override
    public StudentDTO read() throws Exception {
        StudentDTO nextStudent = null;

        if (nextStudentIndex < studentData.size()) {
            nextStudent = studentData.get(nextStudentIndex);
            nextStudentIndex++;
        }
        else {
            nextStudentIndex = 0;
        }

        return nextStudent;
    }
}

Nachdem Sie Ihren benutzerdefinierten ItemReader erstellt haben Klasse müssen Sie den ItemReader konfigurieren Bean, die die Eingabedaten für Ihren Spring Batch-Job bereitstellt. Als nächstes erfahren Sie, wie Sie diese Bean konfigurieren können.

Konfiguration der ItemReader Bean

Sie können Ihren ItemReader konfigurieren Bean, indem Sie diesen Schritten folgen:

Zuerst müssen Sie die Konfigurationsklasse erstellen, die die Beans enthält, die den Ablauf Ihres Batch-Jobs beschreiben. Der Quellcode Ihrer Konfigurationsklasse sieht wie folgt aus:

import org.springframework.context.annotation.Configuration;

@Configuration
public class SpringBatchExampleJobConfig {
}

Zweiter , müssen Sie die Methode erstellen, die Ihren ItemReader konfiguriert Bohne. Diese Methode muss einen ItemReader<StudentDTO> zurückgeben Objekt. Nachdem Sie diese Methode erstellt haben, sieht der Quellcode Ihrer Konfigurationsklasse wie folgt aus:

import org.springframework.batch.item.ItemReader;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

@Configuration
public class SpringBatchExampleJobConfig {

    @Bean
    public ItemReader<StudentDTO> itemReader() {

    }
}

Dritter , müssen Sie sicherstellen, dass der ItemReader() -Methode gibt einen neuen InMemoryStudentReader zurück Objekt. Nachdem Sie den ItemReader() implementiert haben -Methode sieht der Quellcode Ihrer Konfigurationsklasse wie folgt aus:

import org.springframework.batch.item.ItemReader;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

@Configuration
public class SpringBatchExampleJobConfig {

    @Bean
    public ItemReader<StudentDTO> itemReader() {
        return new InMemoryStudentReader();
    }
}

Sie können jetzt einen benutzerdefinierten ItemReader erstellen Klasse und Sie verstehen, wie Sie einen ItemReader konfigurieren können Bean, die die Eingabedaten für Ihren Batch-Job bereitstellt. Fassen wir zusammen, was Sie aus diesem Blogbeitrag gelernt haben.

Zusammenfassung

Dieser Blogbeitrag hat Ihnen vier Dinge beigebracht:

  • Sie können einen benutzerdefinierten ItemReader erstellen durch die Implementierung von ItemReader<T> Schnittstelle.
  • Wenn Sie den ItemReader<T> implementieren -Schnittstelle müssen Sie den Typ des zurückgegebenen Objekts als Typparameter angeben.
  • Der T read() Methode des ItemReader<T> Schnittstelle muss den nächsten T zurückgeben Objekt. Wenn das nächste Objekt nicht gefunden wird, muss es null zurückgeben .
  • Nachdem Sie Ihren benutzerdefinierten ItemReader erstellt haben Klasse müssen Sie den ItemReader konfigurieren Bean, die die Eingabedaten für Ihren Spring Batch-Job bereitstellt.

Im nächsten Teil dieses Tutorials wird beschrieben, wie Sie einen benutzerdefinierten ItemReader erstellen können die die Eingabedaten Ihres Batch-Jobs mithilfe einer externen REST-API liest.


Java-Tag