2017-08-30 4 views
0

Ich habe eine Feder-Batch mit Wiederholung auf dem Schreiber. Der Autor sieht wie folgt aus:Erneut versuchen, im Frühling Batch-Schreiber

public class MyWriter implements ItemWriter<MyClass> { 

    @Retryable(maxAttempts=3, [email protected](delay=2000)) 
    public void write(List<? extends MyClass> list) throws Exception { 
    // db operation 1 -- insert query 
    // some business logic 
    // db operation 2 -- update query 
    } 
} 

Wenn es eine Ausnahme in ‚db Betrieb 2‘ ist, versuchen Sie es erneut aufgerufen wird und die Ausführung beginnt von ‚db Betrieb 1‘ wieder wie erwartet. Aber 'DB-Operation 1' ist eine Einfügeabfrage und löst dieses Mal eine Ausnahme aus, wenn sie versucht, denselben Datensatz erneut einzufügen (und eine eindeutige Integritätsbedingung für die DB fehlschlägt). Letztendlich schlägt der Stapel nach 3 Versuchen fehl, und nichts von diesem Schritt wird an die Datenbank übergeben.

Sollte 'db operation 1' nicht vor dem erneuten Versuch zurückgesetzt werden? Ist das erwartete Verhalten oder etwas falsch mit der Implementierung?

Ich benutze Spring Boot-Anwendung und Feder jdbc.

Antwort

0

Kontrollieren Sie den erneuten Versuch nicht auf diese Weise. Verwenden Sie die Wiederholungslogik von Spring Batch. Spring Batch führt die Transaktion zurück und versucht es auf sichere Weise erneut. Bei der Art, wie Sie Ihre Wiederholung versuchen, stimmt die Wiederholung nicht mit der Transaktion überein, sodass Sie doppelte Datensätze erhalten (da die Transaktion nicht zurückgesetzt wurde).

+0

Das hat geholfen .. danke! – Sakshi

0

Mit Ihrem Spring jdbc würden Sie einen Transaktionsmanager verwenden. Verwenden Sie es, um die Kontrolle über das Festlegen der Transaktionsgrenze zu übernehmen und es nach der Aktualisierungsabfrage zu committen.

Siehe auch this Beispiel beschreibt es, wie Transaktionsmanager zu verwenden.

+0

Ich habe keinen Transaktionsmanager konfiguriert, da Spring Batch Transaktionen eigenständig verwaltet. Die Transaktion funktioniert wie erwartet und das Commit findet erst nach der Aktualisierungsabfrage statt. Das Problem besteht darin, dass die Einfügung bereits bei der Wiederholung stattgefunden hat, obwohl sie noch nicht ausgeführt wurde. – Sakshi

Verwandte Themen