Spring Batch Tutorial:Lesen von Informationen aus einer REST-API
Spring Batch bietet eine gute Unterstützung zum Lesen von Daten aus verschiedenen Datenquellen wie Dateien (CSV oder XML) oder Datenbanken. Es verfügt jedoch nicht über eine integrierte Unterstützung zum Lesen von Eingabedaten aus einer REST-API. Wenn Sie eine REST-API als Datenquelle für Ihren Spring Batch-Job verwenden möchten, müssen Sie einen benutzerdefinierten ItemReader
implementieren die die Eingabedaten aus der REST-API liest.
Dieser Blogbeitrag beschreibt, wie Sie Ihren benutzerdefinierten ItemReader
implementieren können . Nachdem Sie diesen Blogbeitrag gelesen haben, werden Sie:
- Verstehen Sie, wie Sie einen
ItemReader
implementieren können der die Eingabedaten Ihres Batch-Jobs liest, indem er denRestTemplate
verwendet Klasse. - Wissen Sie, wie Sie
ItemReader
konfigurieren können Bean, die die Eingabedaten für Ihren Batch-Job bereitstellt.
Fangen wir an.
Einführung in die Beispielanwendung
Während dieses Blogbeitrags implementieren Sie einen ItemReader
der die Eingabedaten Ihres Spring Batch-Jobs von einem REST-API-Endpunkt liest, der GET
verarbeitet Anfragen werden an den Pfad gesendet:'/api/student/'. Dieser API-Endpunkt gibt die Informationen aller Studenten zurück, die für einen Online-Kurs eingeschrieben sind. Genauer gesagt gibt Ihr API-Endpunkt das folgende JSON-Dokument zurück:
[ { "emailAddress": "[email protected]", "name": "Tony Tester", "purchasedPackage": "master" }, { "emailAddress": "[email protected]", "name": "Nick Newbie", "purchasedPackage": "starter" }, { "emailAddress": "[email protected]", "name": "Ian Intermediate", "purchasedPackage": "intermediate" } ]
Sie müssen das zurückgegebene JSON-Dokument in StudentDTO
umwandeln Objekte, die von Ihrem Batch-Job verarbeitet werden. Die StudentDTO
class enthält die Informationen eines einzelnen Schülers 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; } }
Als Nächstes implementieren Sie einen benutzerdefinierten ItemReader
der die Eingabedaten Ihres Batch-Jobs vom beschriebenen API-Endpunkt liest.
Implementieren Ihres benutzerdefinierten ItemReader
Sie können Ihren benutzerdefinierten ItemReader
implementieren indem Sie diesen Schritten folgen:
Zuerst , müssen Sie eine neue Klasse erstellen (RESTStudentReader
) und implementieren Sie den ItemReader
Schnittstelle. Wenn Sie den ItemReader
implementieren -Schnittstelle müssen Sie den Typ des zurückgegebenen Objekts auf StudentDTO
setzen .
Nachdem Sie Ihren ItemReader
erstellt haben Klasse sieht der Quellcode wie folgt aus:
import org.springframework.batch.item.ItemReader; class RESTStudentReader implements ItemReader<StudentDTO> { }
Zweiter , müssen Sie den folgenden private
hinzufügen Felder zu RESTStudentReader
Klasse:
- Der
final apiUrl
enthält die URL der aufgerufenen REST-API. - Der
final RestTemplate
enthält einen Verweis auf denRestTemplate
Objekt, das Sie verwenden, wenn Sie die Studenteninformationen lesen. - Der
nextStudentIndex
enthält den Index des nächstenStudentDTO
Objekt. - Der
studentData
enthält den gefundenenStudentDTO
Objekte.
Nachdem Sie diese Felder zum RESTStudentReader
hinzugefügt haben Klasse sieht der Quellcode wie folgt aus:
import org.springframework.batch.item.ItemReader; import org.springframework.web.client.RestTemplate; import java.util.List; class RESTStudentReader implements ItemReader<StudentDTO> { private final String apiUrl; private final RestTemplate restTemplate; private int nextStudentIndex; private List<StudentDTO> studentData; }
Dritter müssen Sie dem RESTStudentReader
einen Konstruktor hinzufügen Klasse und implementieren Sie sie, indem Sie diesen Schritten folgen:
- Stellen Sie sicher, dass der Konstruktor die URL der aufgerufenen REST-API und einen
RestTemplate
akzeptiert Objekt als Konstruktorargumente. - Implementieren Sie den Konstruktor, indem Sie seine Konstruktorargumente in den Feldern des erstellten Objekts speichern. Legen Sie den Wert von
nextStudentIndex
fest Feld auf 0.
Nachdem Sie den Konstruktor implementiert haben, wird der Quellcode der RESTStudentReader
Klasse sieht wie folgt aus:
import org.springframework.batch.item.ItemReader; import org.springframework.web.client.RestTemplate; import java.util.List; class RESTStudentReader implements ItemReader<StudentDTO> { private final String apiUrl; private final RestTemplate restTemplate; private int nextStudentIndex; private List<StudentDTO> studentData; RESTStudentReader(String apiUrl, RestTemplate restTemplate) { this.apiUrl = apiUrl; this.restTemplate = restTemplate; nextStudentIndex = 0; } }
Vierter , müssen Sie einen public read()
hinzufügen Methode zum RESTStudentReader
Klasse und geben Sie an, dass die Methode einen StudentDTO
zurückgibt Objekt. Außerdem müssen Sie sicherstellen, dass diese Methode einen Exception
auslösen kann . Nachdem Sie diese Methode zum RESTStudentReader
hinzugefügt haben Klasse, müssen Sie sie implementieren, indem Sie diese Regeln befolgen:
- Wenn die Schülerinformationen nicht gelesen wurden, lesen Sie die Schülerinformationen, indem Sie die REST-API aufrufen.
- Wenn der nächste Schüler gefunden wird, geben Sie den gefundenen
StudentDTO
zurück Objekt und erhöhen Sie den Wert vonnextStudentIndex
Feld (der Index des nächsten Schülers) um 1. - Wenn der nächste Schüler nicht gefunden wird, geben Sie
null
zurück . Stellen Sie sicher, dass IhrItemReader
liest die Eingabedaten von der REST-API, wenn esread()
ist Methode wird das nächste Mal aufgerufen (setzen Sie den Wert dernextStudentIndex
auf 0 und setzen Sie den Wert vonstudentData
Feld aufnull
).
Nachdem Sie den RESTStudentReader
implementiert haben Klasse sieht der Quellcode wie folgt aus:
import org.springframework.batch.item.ItemReader; import org.springframework.http.ResponseEntity; import org.springframework.web.client.RestTemplate; import java.util.Arrays; import java.util.List; class RESTStudentReader implements ItemReader<StudentDTO> { private final String apiUrl; private final RestTemplate restTemplate; private int nextStudentIndex; private List<StudentDTO> studentData; RESTStudentReader(String apiUrl, RestTemplate restTemplate) { this.apiUrl = apiUrl; this.restTemplate = restTemplate; nextStudentIndex = 0; } @Override public StudentDTO read() throws Exception { if (studentDataIsNotInitialized()) { studentData = fetchStudentDataFromAPI(); } StudentDTO nextStudent = null; if (nextStudentIndex < studentData.size()) { nextStudent = studentData.get(nextStudentIndex); nextStudentIndex++; } else { nextStudentIndex = 0; studentData = null; } return nextStudent; } private boolean studentDataIsNotInitialized() { return this.studentData == null; } private List<StudentDTO> fetchStudentDataFromAPI() { ResponseEntity<StudentDTO[]> response = restTemplate.getForEntity(apiUrl, StudentDTO[].class ); StudentDTO[] studentData = response.getBody(); return Arrays.asList(studentData); } }
Bevor Sie Ihren neuen ItemReader
verwenden können müssen Sie den RestTemplate
konfigurieren Bohne. Lassen Sie uns weitermachen und herausfinden, wie Sie diese Bean konfigurieren können.
RestTemplate-Bean konfigurieren
Sie können den RestTemplate
konfigurieren Bean, indem Sie diesen Schritten folgen:
- Fügen Sie einen
public restTemplate()
hinzu -Methode zu Ihrer Anwendungskontext-Konfigurationsklasse. Stellen Sie sicher, dassrestTemplate()
-Methode gibt einRestTemplate
zurück Objekt und kommentieren Sie es mit dem@Bean
Anmerkung. - Implementieren Sie den
restTemplate()
Methode durch Rückgabe eines neuenRestTemplate
Objekt.
Wenn Sie Spring Framework verwenden, sieht der Quellcode Ihrer Anwendungskontext-Konfigurationsklasse wie folgt aus:
import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import org.springframework.web.client.RestTemplate; @Configuration public class SpringBatchExampleContext { @Bean public RestTemplate restTemplate() { return new RestTemplate(); } }
Wenn Sie Spring Boot verwenden, können Sie auch den restTemplate()
hinzufügen -Methode zu Ihrer Anwendungsklasse, die mit @SpringBootApplication
annotiert ist Anmerkung. Der Quellcode dieser Klasse sieht wie folgt aus:
import org.springframework.batch.core.configuration.annotation.EnableBatchProcessing; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; import org.springframework.context.annotation.Bean; import org.springframework.scheduling.annotation.EnableScheduling; import org.springframework.web.client.RestTemplate; @SpringBootApplication @EnableBatchProcessing @EnableScheduling public class SpringBatchExampleApplication { @Bean public RestTemplate restTemplate() { return new RestTemplate(); } public static void main(String[] args) { SpringApplication.run(SpringBatchExampleApplication.class, args); } }
Nachdem Sie den RestTemplate
konfiguriert haben Bean können Sie endlich Ihren ItemReader
konfigurieren Bohne.
Konfiguration der ItemReader Bean
Sie können den ItemReader
konfigurieren Bean, indem Sie diesen Schritten folgen:
Zuerst , müssen Sie eine neue Konfigurationsklasse erstellen. Nachdem Sie diese Klasse erstellt haben, sieht ihr Quellcode wie folgt aus:
import org.springframework.context.annotation.Configuration; @Configuration public class SpringBatchExampleJobConfig { }
Zweiter müssen Sie eine neue Methode erstellen, die Ihren ItemReader
konfiguriert Bohne. Diese Methode gibt einen ItemReader<StudentDTO>
zurück Objekt, und es nimmt einen Environment
Objekt und ein RestTemplate
Objekt als Methodenparameter.
Nachdem Sie diese Methode zu Ihrer Konfigurationsklasse hinzugefügt haben, sieht ihr Quellcode wie folgt aus:
import org.springframework.batch.item.ItemReader; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import org.springframework.core.env.Environment; import org.springframework.web.client.RestTemplate; @Configuration public class SpringBatchExampleJobConfig { @Bean public ItemReader<StudentDTO> itemReader(Environment environment, RestTemplate restTemplate) { } }
Vierter , müssen Sie den itemReader()
implementieren Methode durch Rückgabe eines neuen RESTStudentReader
Objekt. Wenn Sie einen neuen RESTStudentReader
erstellen -Objekt müssen Sie die folgenden Objekte als Konstruktorargumente übergeben:
- Die URL der aufgerufenen REST-API. Sie können diese Informationen aus einer Eigenschaftendatei lesen, indem Sie den
Environment
verwenden Objekt als Methodenparameter angegeben. - Der
RestTemplate
Objekt, das verwendet wird, um die Schülerinformationen von der aufgerufenen REST-API abzufragen.
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; import org.springframework.core.env.Environment; import org.springframework.web.client.RestTemplate; @Configuration public class SpringBatchExampleJobConfig { @Bean public ItemReader<StudentDTO> itemReader(Environment environment, RestTemplate restTemplate) { return new RESTStudentReader(environment.getRequiredProperty("rest.api.url"), restTemplate ); } }
Sie können jetzt einen benutzerdefinierten ItemReader
schreiben die die Eingabedaten Ihres Batch-Jobs von einer REST-API liest. Fassen wir zusammen, was Sie aus diesem Blogbeitrag gelernt haben.
Zusammenfassung
Dieser Blogbeitrag hat Ihnen zwei Dinge beigebracht:
- Spring Batch hat keinen
ItemReader
die Informationen aus einer REST-API lesen kann. - Wenn Sie die Eingabedaten Ihres Batch-Jobs von einer REST-API lesen möchten, können Sie diese Informationen mit dem
RestTemplate
lesen Klasse.
Der nächste Teil dieses Tutorials beschreibt, wie Sie die Eingabedaten Ihres Batch-Jobs aus einer Excel-Tabelle lesen können.