Aufgaben verketten

Mit WorkManager können Sie eine Arbeitskette erstellen und in die Warteschlange einreihen, Aufgaben erstellt und definiert, in welcher Reihenfolge sie ausgeführt werden sollen. Dieses ist besonders nützlich, wenn Sie mehrere Aufgaben in einem in eine bestimmte Reihenfolge bringen.

Um eine Arbeitskette zu erstellen, können Sie WorkManager.beginWith(OneTimeWorkRequest) oder WorkManager.beginWith(List<OneTimeWorkRequest>) , die jeweils eine Instanz von WorkContinuation

Anschließend kann ein WorkContinuation verwendet werden, um den abhängigen OneTimeWorkRequest hinzuzufügen. Instanzen mit then(OneTimeWorkRequest) oder then(List<OneTimeWorkRequest>) .

Bei jedem Aufruf von WorkContinuation.then(...) wird eine neue Instanz von WorkContinuation zurückgegeben. Wenn Sie eine List von OneTimeWorkRequest Instanzen hinzufügen, können diese Anfragen möglicherweise parallel ausgeführt werden.

Schließlich können Sie den WorkContinuation.enqueue() zu enqueue() Ihrer Kette von WorkContinuations.

Sehen wir uns ein Beispiel an. In diesem Beispiel sind 3 verschiedene Mitarbeiterjobs für die Ausführung konfiguriert (möglicherweise parallel). Die Ergebnisse dieser Worker sind an einen Worker-Job im Cache übergeben. Schließlich wird die Ausgabe an einen Upload-Worker übergeben, der die Ergebnisse in einen Remote- Server.

Kotlin

WorkManager.getInstance(myContext)
   // Candidates to run in parallel
   .beginWith(listOf(plantName1, plantName2, plantName3))
   // Dependent work (only runs after all previous work in chain)
   .then(cache)
   .then(upload)
   // Call enqueue to kick things off
   .enqueue()

Java

WorkManager.getInstance(myContext)
   // Candidates to run in parallel
   .beginWith(Arrays.asList(plantName1, plantName2, plantName3))
   // Dependent work (only runs after all previous work in chain)
   .then(cache)
   .then(upload)
   // Call enqueue to kick things off
   .enqueue();

Eingabe-Fusionen

Wenn Sie OneTimeWorkRequest-Instanzen verketten, wird die Ausgabe der übergeordneten -Anfragen als Eingabe an die untergeordneten Elemente übergeben. Im obigen Beispiel ist also Die Ausgaben von plantName1, plantName2 und plantName3 werden als Eingaben für die cache-Anfrage.

Um Eingaben aus mehreren übergeordneten Arbeitsanfragen zu verwalten, verwendet WorkManager InputMerger

WorkManager bietet zwei verschiedene Arten von InputMerger:

  • OverwritingInputMerger versucht, der Ausgabe alle Schlüssel aus allen Eingaben hinzuzufügen. Bei Konflikten werden die zuvor festgelegten Schlüssel überschrieben.

  • ArrayCreatingInputMerger versucht, die Eingaben zusammenzuführen und bei Bedarf Arrays zu erstellen.

Wenn Sie einen spezifischeren Anwendungsfall haben, können Sie Ihren eigenen erstellen, indem Sie abgeleitete Klassen InputMerger

Eingabezusammenführung überschreiben

OverwritingInputMerger ist die standardmäßige Zusammenführungsmethode. Wenn Schlüssel vorhanden sind, Konflikte in der Zusammenführung, dann überschreibt der letzte Wert für einen Schlüssel alle vorherigen Versionen in den resultierenden Ausgabedaten.

Wenn z. B. die Pflanzeneingaben jeweils einen Schlüssel haben, der mit dem Variablennamen ("plantName1", "plantName2" und "plantName3") enthält, ist der Daten, die an den cache-Worker übergeben werden, haben drei Schlüssel/Wert-Paare.

Diagramm mit drei Jobs, die verschiedene Ausgaben an den nächsten Job in der Kette übergeben. Da die drei Ausgaben alle unterschiedliche Schlüssel haben, erhält der nächste Job drei Schlüssel/Wert-Paare.

Wenn es einen Konflikt gibt, gewinnt der letzte Worker, der den Vorgang abgeschlossen hat, und ihr Wert wird an cache übergeben.

Diagramm mit drei Jobs, die Ausgaben an den nächsten Job in der Kette übergeben. In diesem Fall erzeugen zwei dieser Jobs Ausgaben mit demselben Schlüssel. Der nächste Job erhält dann zwei Schlüssel/Wert-Paare, wobei eine der in Konflikt stehenden Ausgaben verworfen wird.

Da Ihre Arbeitsanfragen parallel ausgeführt werden, gibt es keine Garantien für in der sie ausgeführt werden. Im Beispiel oben könnte plantName1 einen Wert von "tulip" oder "elm", je nachdem, welcher Wert geschrieben wird zuletzt. Wenn die Möglichkeit eines Schlüsselkonflikts besteht und Sie die gesamte Ausgabe beibehalten müssen bei einer Zusammenführung, dann ist ArrayCreatingInputMerger möglicherweise die bessere Option.

ArrayErstellenEingabezusammenführung

Da wir für das obige Beispiel die Ausgaben aller Pflanzen Name Workers enthalten, sollten wir ein ArrayCreatingInputMerger verwenden.

Kotlin

val cache: OneTimeWorkRequest = OneTimeWorkRequestBuilderP<lantWorker(>)
   .setInputMerger(ArrayCreatingInputMerger::class)
   .setConstraints(constraints)
   .build()

Java

OneTimeWorkRequest cache = new OneTimeWorkRequest.Builder(PlantWorker.class)
       .setInputMerger(ArrayCreatingInputMerger.class)
       .setConstraints(constraints)
       .build();

ArrayCreatingInputMerger koppelt jeden Schlüssel mit einem Array. Wenn jeder der Schlüssel eindeutig ist, ist das Ergebnis eine Reihe von Arrays mit einem Element.

Diagramm, das drei Jobs zeigt, die verschiedene Ausgaben an den nächsten Job in der Kette übergeben. Im nächsten Job werden drei Arrays übergeben, eines für jeden der Ausgabeschlüssel. Jedes Array hat ein einzelnes Mitglied.

Bei Schlüsselkollisionen werden die entsprechenden Werte gruppiert in einem Array.

Diagramm mit drei Jobs, die Ausgaben an den nächsten Job in der Kette übergeben. In diesem Fall erzeugen zwei dieser Jobs Ausgaben mit demselben Schlüssel. Im nächsten Job werden zwei Arrays übergeben, eines für jeden Schlüssel. Eines dieser Arrays hat zwei Mitglieder, da es zwei Ausgaben mit diesem Schlüssel gab.

Verkettung und Arbeitsstatus

Ketten von OneTimeWorkRequest werden nacheinander ausgeführt, solange ihre Arbeit erfolgreich abgeschlossen wurde (d. h. es wird ein Result.success() zurückgegeben). Arbeit Anfragen können fehlschlagen oder während der Ausführung abgebrochen werden. Dies hat nachgelagerte Auswirkungen auf abhängige Arbeitsanfragen.

Wenn die erste OneTimeWorkRequest in eine Kette von Arbeitsanfragen eingereiht wird, Alle nachfolgenden Arbeitsanfragen werden blockiert, bis die Arbeit dieser ersten Aufgabe erledigt wird. abgeschlossen ist.

Diagramm mit einer Kette von Jobs. Der erste Job wird in die Warteschlange gestellt. werden alle aufeinanderfolgenden Jobs blockiert, bis der erste abgeschlossen ist.

Sobald Sie in die Warteschlange gestellt und alle Arbeitsbeschränkungen erfüllt wurden, ist die erste Arbeitsanfrage aktiv ist. Wenn die Arbeit im Stammverzeichnis erfolgreich abgeschlossen wurde OneTimeWorkRequest oder List<OneTimeWorkRequest> (d. h., es wird eine Result.success()), lautet die nächste Gruppe abhängiger Arbeitsanfragen in der Warteschlange.

Diagramm mit einer Kette von Jobs. Der erste Job war erfolgreich und seine beiden unmittelbaren Nachfolger werden in die Warteschlange gestellt. Die verbleibenden Jobs werden gesperrt, da sie ihre vorherigen Jobs beenden.

Solange jede Arbeitsanfrage erfolgreich abgeschlossen wird, durch die gesamte Arbeitskette durch, bis alle Arbeiten im abgeschlossen ist. Das ist zwar der einfachste und oft bevorzugte Fall, ist genauso wichtig, um die Problematik zu kümmern.

Wenn während der Verarbeitung Ihrer Arbeitsanfrage ein Fehler auftritt, können Sie Folgendes tun: wiederholen Sie die Anfrage gemäß einer Backoff-Richtlinie, definieren. Wenn Sie eine Anfrage wiederholen, die Teil einer Kette ist, bedeutet das, dass nur diese Anfrage mit den bereitgestellten Eingabedaten wiederholt werden. Alle parallel ausgeführten Arbeiten sind davon nicht betroffen.

Diagramm mit einer Kette von Jobs. Einer der Jobs ist fehlgeschlagen, es wurde jedoch eine Backoff-Richtlinie definiert. Dieser Job wird noch einmal ausgeführt, nachdem die entsprechende Zeit verstrichen ist. Die Jobs, die in der Kette folgen, werden blockiert, bis er erfolgreich ausgeführt wird.

Weitere Informationen zum Definieren benutzerdefinierter Wiederholungsstrategien finden Sie unter Wiederholung und Backoff Richtlinien:

Wenn diese Wiederholungsrichtlinie nicht definiert oder ausgeschöpft ist oder in dem ein OneTimeWorkRequest Result.failure() zurückgibt, Arbeitsanfrage und alle abhängigen Arbeitsanfragen sind als FAILED. gekennzeichnet

Diagramm mit einer Kette von Jobs. Ein Job ist fehlgeschlagen und kann nicht wiederholt werden. Infolgedessen schlagen auch alle nachfolgenden Jobs in der Kette fehl.

Das Gleiche gilt, wenn ein OneTimeWorkRequest abgebrochen wird. Alle abhängigen Arbeitsanfragen sind ebenfalls mit CANCELLED gekennzeichnet und ihre Arbeit wird nicht ausgeführt.

Diagramm mit einer Kette von Jobs. Ein Job wurde abgebrochen. Infolgedessen werden alle Jobs, die in der Kette folgen, ebenfalls abgebrochen.

Wenn Sie weitere Arbeitsanfragen an eine Kette anhängen, die fehlgeschlagen ist oder abgebrochene Arbeitsanfragen hat, wird die neu angehängte mit FAILED bzw. CANCELLED gekennzeichnet. Wenn Sie die Arbeit verlängern möchten, einer vorhandenen Kette, siehe APPEND_OR_REPLACE in VorhandeneWorkPolicy.

Beim Erstellen von Ketten von Arbeitsanfragen sollten abhängige Arbeitsanfragen Wiederholungsrichtlinien sorgen, um sicherzustellen, dass Aufgaben immer zügig abgeschlossen werden. Fehlgeschlagene Arbeitsanfragen können zu unvollständigen Ketten und/oder zu einem unerwarteten Status führen.

Weitere Informationen finden Sie unter Abbrechen und Beenden Arbeit.