Perantaian pekerjaan

WorkManager memungkinkan Anda membuat dan mengantrekan rantai pekerjaan yang menentukan beberapa tugas dependen, serta menetapkan urutan kerjanya. Fungsi ini sangat berguna saat Anda perlu menjalankan beberapa tugas dalam urutan tertentu.

Untuk membuat rantai pekerjaan, Anda dapat menggunakan WorkManager.beginWith(OneTimeWorkRequest) atau WorkManager.beginWith(List<OneTimeWorkRequest>), yang masing-masing menampilkan instance WorkContinuation.

WorkContinuation kemudian dapat digunakan untuk menambahkan instance OneTimeWorkRequest dependen menggunakan then(OneTimeWorkRequest) atau then(List<OneTimeWorkRequest>) .

Setiap pemanggilan WorkContinuation.then(...), akan menampilkan instance WorkContinuation baru. Jika Anda menambahkan List OneTimeWorkRequest, permintaan ini dapat berpotensi berjalan secara paralel.

Terakhir, Anda dapat menggunakan metode WorkContinuation.enqueue() untuk enqueue() rantai WorkContinuation.

Perhatikan contoh berikut. Dalam contoh ini, 3 tugas Pekerja berbeda dikonfigurasi untuk dijalankan (kemungkinan secara paralel). Hasil Pekerja tersebut kemudian digabungkan dan diteruskan ke tugas Pekerja dalam cache. Terakhir, output dari tugas tersebut diteruskan ke Pekerja upload, yang mengupload hasilnya ke server jarak jauh.

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();

Gabungan Input

Saat Anda membuat rantai OneTimeWorkRequest instance, output permintaan pekerjaan induk akan diteruskan sebagai input ke turunan. Jadi, dalam contoh di atas, output plantName1, plantName2, dan plantName3 akan diteruskan sebagai input ke permintaan cache.

Untuk mengelola input dari beberapa permintaan pekerjaan induk, WorkManager menggunakan InputMerger.

Ada dua jenis InputMerger yang disediakan oleh WorkManager:

  • OverwritingInputMerger mencoba menambahkan semua kunci dari semua input ke output. Hal ini akan menimpa kunci yang telah disetel sebelumnya jika terjadi konflik.

  • ArrayCreatingInputMerger mencoba menggabungkan input, yang membuat array jika perlu.

Jika memiliki kasus penggunaan yang lebih spesifik, Anda dapat menulis sendiri dengan subclass InputMerger.

OverwritingInputMerger

OverwritingInputMerger adalah metode penggabungan default. Jika ada konflik kunci dalam penggabungan, nilai terbaru untuk kunci akan menimpa versi sebelumnya dalam data output yang dihasilkan.

Misalnya, jika masing-masing input tanaman memiliki kunci yang cocok dengan nama variabel masing-masing ("plantName1", "plantName2", dan "plantName3"), data yang diteruskan ke cache pekerja akan memiliki tiga kunci pasangan nilai.

Diagram yang menunjukkan tiga tugas yang menyampaikan output yang berbeda ke tugas berikutnya dalam rantai. Karena ketiga output memiliki kunci yang berbeda, tugas berikutnya akan menerima tiga key-value pair.

Jika ada konflik, pekerja terakhir yang menyelesaikan “menang”, dan nilainya diteruskan ke cache.

Diagram yang menunjukkan tiga tugas yang meneruskan output ke tugas berikutnya di rantai tersebut. Dalam hal ini, dua dari tugas tersebut menghasilkan output dengan kunci yang sama. Hasilnya, tugas berikutnya menerima dua key/value pair, dengan salah satu output yang saling bertentangan akan hilang.

Karena permintaan pekerjaan dijalankan secara paralel, Anda tidak memiliki jaminan untuk urutan yang menjalankannya. Pada contoh di atas, plantName1 dapat menyimpan nilai "tulip" atau "elm", bergantung pada nilai yang terakhir ditulis. Jika Anda memiliki peluang konflik utama dan Anda perlu mempertahankan semua data output dalam penggabungan, ArrayCreatingInputMerger mungkin merupakan opsi yang lebih baik.

ArrayCreatingInputMerger

Untuk contoh di atas, jika ingin mempertahankan output dari semua Pekerja nama tumbuhan, kita harus menggunakan ArrayCreatingInputMerger.

Kotlin

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

Java

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

ArrayCreatingInputMerger menghubungkan setiap kunci dengan array. Jika masing-masing kunci bersifat unik, maka hasilnya adalah rangkaian array satu elemen.

Diagram yang menunjukkan tiga tugas yang menyampaikan output yang berbeda ke tugas berikutnya dalam rantai. Tugas berikutnya adalah meneruskan tiga array, satu untuk setiap kunci output. Setiap array memiliki satu anggota.

Jika ada konflik kunci, nilai apa pun yang sesuai akan dikelompokkan bersama dalam array.

Diagram yang menunjukkan tiga tugas yang meneruskan output ke tugas berikutnya di rantai tersebut. Dalam hal ini, dua dari tugas tersebut menghasilkan output dengan kunci yang sama. Tugas berikutnya adalah meneruskan dua araay, satu untuk setiap kunci. Salah satu array tersebut memiliki dua anggota, karena ada dua output dengan kunci tersebut.

Status Pekerjaan dan Perantaian

Rantai OneTimeWorkRequest dijalankan secara berurutan selama pekerjaannya berhasil diselesaikan (yaitu, mereka mengembalikan Result.success()). permintaan Pekerjaan mungkin gagal atau dibatalkan saat berjalan, yang memiliki efek downstream pada permintaan pekerjaan dependen.

Saat OneTimeWorkRequest pertama diantrekan dalam rantai permintaan pekerjaan, semua permintaan pekerjaan berikutnya diblokir hingga pekerjaan dari permintaan pekerjaan pertama tersebut selesai.

Diagram yang menampilkan rantai pekerjaan. Tugas pertama dalam antrean; semua tugas yang berurutan diblokir hingga tugas pertama selesai.

Setelah diantrekan dan semua batasan pekerjaan terpenuhi, permintaan pekerjaan pertama akan berjalan. Jika pekerjaan berhasil diselesaikan dalam root OneTimeWorkRequest atau List<OneTimeWorkRequest> (artinya, itu mengembalikan Result.success()), maka set permintaan pekerjaan dependen berikutnya akan diantrekan.

Diagram yang menampilkan rantai pekerjaan. Tugas pertama telah berhasil, dan dua berikutnya langsung diantrekan. Tugas yang tersisa diblokir sebelum tugas selesai.

Selama setiap permintaan pekerjaan berhasil diselesaikan, pola yang sama tersebut tetap berlaku di seluruh rantai permintaan pekerjaan Anda hingga semua pekerjaan dalam rantai tersebut selesai. Meskipun ini adalah kasus yang paling sederhana dan sering dipilih, status error sama pentingnya untuk ditangani.

Jika terjadi error saat pekerja memproses permintaan kerja, Anda dapat mencoba kembali permintaan tersebut sesuai dengan kebijakan backoff yang Anda tentukan. Mencoba lagi permintaan yang merupakan bagian dari rantai berarti bahwa hanya permintaan tersebut yang akan dicoba lagi dengan data input yang diberikan. Setiap pekerjaan yang berjalan secara paralel tidak akan terpengaruh.

Diagram yang menampilkan rantai pekerjaan. Salah satu tugas gagal, tetapi kebijakan backoff-nya telah ditetapkan. Tugas tersebut akan dijalankan kembali setelah jangka waktu tertentu telah berlalu. Pekerjaan tersebut, setelah berada dalam rantai, diblokir sampai berhasil dijalankan.

Untuk mengetahui informasi lebih lanjut cara menentukan strategi percobaan ulang kustom, lihat Kebijakan Percobaan Ulang dan Backoff.

Jika kebijakan percobaan ulang tidak ditentukan atau habis, atau Anda mencapai beberapa keadaan saat OneTimeWorkRequest menampilkan Result.failure(), maka permintaan kerja dan semua permintaan pekerjaan dependen akan ditandai sebagai FAILED.

Diagram yang menampilkan rantai pekerjaan. Satu tugas gagal dan tidak dapat dicoba lagi. Akibatnya, semua pekerjaan setelahnya dalam rantai juga gagal.

Logika yang sama berlaku saat OneTimeWorkRequest dibatalkan. Semua permintaan pekerjaan dependen juga ditandai CANCELLED dan tugasnya tidak akan dijalankan.

Diagram yang menampilkan rantai pekerjaan. Satu tugas telah dibatalkan. Akibatnya, semua tugas setelahnya dalam rantai juga dibatalkan.

Perlu diketahui bahwa jika Anda menambahkan lebih banyak permintaan pekerjaan ke rantai yang telah gagal atau telah membatalkan permintaan pekerjaan, permintaan pekerjaan yang baru saja ditambahkan juga akan ditandai FAILED atau CANCELLED. Jika Anda ingin memperluas pekerjaan rantai yang sudah ada, lihat APPEND_OR_REPLACE di ExistWorkPolicy.

Saat membuat rantai permintaan pekerjaaan, permintaan pekerjaan dependen harus menentukan kebijakan coba lagi untuk memastikan bahwa pekerjaan selalu diselesaikan pada waktu yang tepat. Permintaan pekerjaan yang gagal dapat menyebabkan rantai yang tidak lengkap dan/atau status tidak terduga.

Untuk informasi selengkapnya, lihat Membatalkan dan Menghentikan Pekerjaan.