Zincirleme iş

WorkManager, birden fazla bağımlı görevi belirten ve hangi sırada çalıştırılmaları gerektiğini tanımlayan bir çalışma zinciri oluşturup sıraya almanıza olanak tanır. Bu işlev, özellikle belirli bir sırada birkaç görev çalıştırmanız gerektiğinde yararlıdır.

Bir çalışma zinciri oluşturmak için WorkManager.beginWith(OneTimeWorkRequest) veya WorkManager.beginWith(List<OneTimeWorkRequest>) kullanabilirsiniz. Bunların her biri WorkContinuation örneğini döndürür.

Daha sonra then(OneTimeWorkRequest) veya then(List<OneTimeWorkRequest>) kullanılarak bağımlı OneTimeWorkRequest örnekleri eklemek için WorkContinuation kullanılabilir.

WorkContinuation.then(...) işlevinin her çağrılması, WorkContinuation işlevinin yeni bir örneğini döndürür. List örneği OneTimeWorkRequest eklerseniz bu istekler potansiyel olarak paralel çalışabilir.

Son olarak, WorkContinuation zincirinizi enqueue() için WorkContinuation.enqueue() yöntemini kullanabilirsiniz.

Bir örneğe göz atalım. Bu örnekte, 3 farklı Worker işinin (potansiyel olarak paralel) çalışacak şekilde yapılandırıldığı varsayılmaktadır. Bu çalışanların sonuçları daha sonra birleştirilir ve önbelleğe alma çalışanı işine aktarılır. Son olarak, bu işin çıkışı, sonuçları uzak bir sunucuya yükleyen bir yükleme işçisine iletilir.

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

Giriş Birleştiricileri

OneTimeWorkRequest örneklerini zincirlediğinizde üst iş isteklerinin çıkışı, alt öğelere giriş olarak iletilir. Bu nedenle, yukarıdaki örnekte plantName1, plantName2 ve plantName3 çıkışları, cache isteğinin girişleri olarak iletilir.

WorkManager, birden fazla üst iş isteğinden gelen girişleri yönetmek için InputMerger kullanır.

WorkManager tarafından sağlanan iki farklı InputMerger türü vardır:

  • OverwritingInputMerger Tüm girişlerdeki tüm anahtarları çıkışa eklemeye çalışır. Çakışma olması durumunda, daha önce ayarlanan anahtarların üzerine yazılır.

  • ArrayCreatingInputMerger girişleri birleştirmeye çalışır ve gerektiğinde diziler oluşturur.

Daha spesifik bir kullanım alanınız varsa InputMerger alt sınıfını oluşturarak kendi kullanım alanınızı yazabilirsiniz.

OverwritingInputMerger

OverwritingInputMerger, varsayılan birleştirme yöntemidir. Birleştirme işleminde anahtar çakışmaları varsa bir anahtarın en son değeri, sonuçtaki çıkış verilerinde önceki tüm sürümlerin üzerine yazılır.

Örneğin, tesis girişlerinin her birinde kendi değişken adlarıyla ("plantName1", "plantName2" ve "plantName3") eşleşen bir anahtar varsa cache çalışanına iletilen verilerde üç anahtar-değer çifti bulunur.

Zincirdeki bir sonraki işe farklı çıkışlar aktaran üç işi gösteren şema. Üç çıkışın da farklı anahtarları olduğundan, sonraki işe üç anahtar/değer çifti gönderilir.

Çakışma varsa "kazanan" son çalışan olur ve değeri cache'ya aktarılır.

Çıktıları zincirdeki bir sonraki işe aktaran üç işi gösteren diyagram. Bu durumda, söz konusu işlerden ikisi aynı anahtara sahip çıkışlar üretir. Sonuç olarak, sonraki iş iki anahtar/değer çifti alır ve çakışan çıkışlardan biri bırakılır.

Çalışma istekleriniz paralel olarak çalıştırıldığından, hangi sırayla çalıştırılacağı garanti edilmez. Yukarıdaki örnekte, hangi değerin en son yazıldığına bağlı olarak plantName1, "tulip" veya "elm" değerini içerebilir. Anahtar çakışması ihtimali varsa ve birleştirme işleminde tüm çıkış verilerini korumanız gerekiyorsa ArrayCreatingInputMerger daha iyi bir seçenek olabilir.

ArrayCreatingInputMerger

Yukarıdaki örnekte, tüm tesis adı çalışanlarının çıkışlarını korumak istediğimiz için ArrayCreatingInputMerger kullanmalıyız.

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 her anahtarı bir diziyle eşleştirir. Anahtarların her biri benzersizse sonucunuz tek öğeli dizilerden oluşan bir seri olur.

Zincirdeki bir sonraki işe farklı çıkışlar aktaran üç işi gösteren şema. Sonraki işe, çıkış anahtarlarının her biri için bir tane olmak üzere üç dizi iletilir. Her dizide tek bir üye bulunur.

Anahtar çakışması varsa ilgili değerler bir dizide birlikte gruplandırılır.

Çıktıları zincirdeki bir sonraki işe aktaran üç işi gösteren diyagram. Bu durumda, söz konusu işlerden ikisi aynı anahtara sahip çıkışlar üretir. Sonraki işe, her anahtar için bir tane olmak üzere iki dizi iletilir. Bu anahtarla iki çıkış olduğundan dizilerden birinde iki üye bulunur.

Zincirleme ve Çalışma Durumları

OneTimeWorkRequest zincirleri, çalışmaları başarıyla tamamlandığı (yani Result.success() döndürdüğü) sürece sırayla yürütülür. Çalışma istekleri, çalışırken başarısız olabilir veya iptal edilebilir. Bu durum, bağımlı çalışma istekleri üzerinde etkiler yaratır.

Bir iş isteği zincirinde ilk OneTimeWorkRequest sıraya alındığında, bu ilk iş isteğinin işi tamamlanana kadar sonraki tüm iş istekleri engellenir.

Bir iş zincirini gösteren şema. İlk iş sıraya alınır. İlk iş tamamlanana kadar sonraki tüm işler engellenir.

Sıraya alındıktan ve tüm çalışma kısıtlamaları karşılandıktan sonra ilk iş isteği çalışmaya başlar. Çalışma kök dizinde OneTimeWorkRequest veya List<OneTimeWorkRequest> başarılı bir şekilde tamamlanırsa (yani Result.success() döndürürse) bağımlı çalışma isteklerinin bir sonraki grubu sıraya alınır.

Bir iş zincirini gösteren şema. İlk iş başarıyla tamamlandı ve hemen sonraki iki iş sıraya alındı. Kalan işler, önceki işler tamamlanana kadar engellenir.

Her iş isteği başarıyla tamamlandığı sürece bu aynı kalıp, zincirdeki tüm işler tamamlanana kadar iş isteği zincirinizin geri kalanına yayılır. Bu en basit ve genellikle tercih edilen durum olsa da hata durumlarının da ele alınması gerekir.

Bir çalışan, iş isteğinizi işlerken hata oluşursa tanımladığınız bir geri çekilme politikasına göre isteği yeniden deneyebilirsiniz. Bir zincirin parçası olan bir isteği yeniden denemek, yalnızca bu isteğin kendisine sağlanan giriş verileriyle yeniden deneneceği anlamına gelir. Paralel olarak çalışan işlemler etkilenmez.

Bir iş zincirini gösteren şema. İşlerden biri başarısız oldu ancak geri yükleme aralığı politikası tanımlanmıştı. Bu iş, uygun süre geçtikten sonra yeniden çalıştırılır. Zincirdeki sonraki işler, bu iş başarılı bir şekilde çalışana kadar engellenir.

Özel yeniden deneme stratejileri tanımlama hakkında daha fazla bilgi için Yeniden Deneme ve Geri Çekilme Politikası başlıklı makaleyi inceleyin.

Yeniden deneme politikası tanımlanmamışsa veya tükenmişse ya da OneTimeWorkRequest'nın Result.failure() döndürdüğü bir duruma ulaşırsanız bu çalışma isteği ve tüm bağımlı çalışma istekleri FAILED. olarak işaretlenir.

Bir iş zincirini gösteren şema. Bir iş başarısız oldu ve tekrar denenemez. Sonuç olarak, zincirdeki tüm işler de başarısız olur.

Aynı mantık, OneTimeWorkRequest iptal edildiğinde de geçerlidir. Bağımlı iş istekleri de CANCELLED olarak işaretlenir ve bu işler yürütülmez.

Bir iş zincirini gösteren şema. Bir iş iptal edildi. Bu nedenle, zincirdeki tüm sonraki işler de iptal edilir.

Başarısız olan veya iş isteklerinin iptal edildiği bir zincire daha fazla iş isteği eklerseniz yeni eklenen iş isteğinizin de sırasıyla FAILED veya CANCELLED olarak işaretleneceğini unutmayın. Mevcut bir zincirin çalışmasını genişletmek istiyorsanız APPEND_OR_REPLACE bölümüne bakın. ExistingWorkPolicy.

İş isteği zincirleri oluştururken, işin her zaman zamanında tamamlanmasını sağlamak için bağımlı iş isteklerinde yeniden deneme politikaları tanımlanmalıdır. Başarısız olan iş istekleri, eksik zincirlere ve/veya beklenmedik durumlara neden olabilir.

Daha fazla bilgi için Çalışmayı İptal Etme ve Durdurma başlıklı makaleyi inceleyin.