Zincirleme iş

WorkManager, birden fazla bağımlı görev belirten ve bunların hangi sırayla çalışmaları gerektiğini tanımlayan bir iş zinciri oluşturup sıraya koymanıza olanak tanır. Bu işlev, birkaç görevi belirli bir sırayla çalıştırmanız gerektiğinde özellikle kullanışlıdır.

İş zinciri oluşturmak için her biri WorkContinuation örneği döndüren WorkManager.beginWith(OneTimeWorkRequest) veya WorkManager.beginWith(List<OneTimeWorkRequest>) kullanabilirsiniz.

Ardından WorkContinuation, then(OneTimeWorkRequest) veya then(List<OneTimeWorkRequest>) ile bağımlı OneTimeWorkRequest örnekleri eklemek için kullanılabilir.

WorkContinuation.then(...) her çağrıldığında yeni bir WorkContinuation örneği döndürülür. OneTimeWorkRequest örnekten List tanesini eklerseniz bu istekler potansiyel olarak paralel çalışabilir.

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

Bir örnekle açıklayalım. Bu örnekte, 3 farklı Çalışan işi çalışacak şekilde yapılandırılmıştır (muhtemelen paralel olarak). Bu Çalışanların sonuçları daha sonra birleştirilir ve bir önbelleğe alma Çalışanı işine aktarılır. Son olarak, bu işin çıkışı bir yükleme çalışanına iletilir. Bu çalışan, sonuçları uzak bir sunucuya yükler.

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ştiriciler

OneTimeWorkRequest örneklerini zincirlediğinizde, üst çalışma isteklerinin çıkışı alt öğelere giriş olarak iletilir. Dolayısıyla yukarıdaki örnekte plantName1, plantName2 ve plantName3 çıktıları cache isteğine girdi olarak aktarılır.

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

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

  • OverwritingInputMerger, tüm girişlerdeki tüm tuşları çıkışa eklemeye çalışır. Çakışma olması halinde önceden ayarlanan anahtarların üzerine yazılır.

  • ArrayCreatingInputMerger, gerektiğinde dizi oluşturarak girişleri birleştirmeye çalışır.

Daha spesifik bir kullanım alanınız varsa InputMerger alt sınıfını kullanarak kendi senaryonuzu yazabilirsiniz.

Üzerine Yazarak GirdiBirleştirme

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

Örneğin, bitki girişlerinin her birinde ilgili değişken adlarıyla ("plantName1", "plantName2" ve "plantName3") eşleşen bir anahtar varsa cache çalışanına iletilen veriler üç anahtar/değer çiftine sahip olur.

Zincirdeki bir sonraki işe farklı çıkışlar geçiren üç işi gösteren şema. Üç çıkışın hepsinin farklı anahtarları olduğundan bir sonraki iş üç anahtar/değer çifti alır.

Çakışma olması halinde "kazanır" işlemini tamamlayan son çalışan, değeri cache adlı CSS'ye iletilir.

Çıkışları zincirdeki bir sonraki işe aktaran üç işi gösteren şema. Bu durumda, bu işlerden ikisi aynı anahtarla çıktı üretir. Sonuç olarak, bir sonraki iş iki anahtar/değer çifti alır ve çakışan çıkışlardan biri çıkar.

İş istekleriniz birbirine paralel olarak yapıldığından, işlerin hangi sırayla gerçekleştirileceği konusunda bir garantiniz yoktur. Yukarıdaki örnekte plantName1, en son hangi değerin yazıldığına bağlı olarak "tulip" veya "elm" değerini alabilir. Önemli bir çakışma ihtimaliniz varsa ve bir birleştirmede tüm çıkış verilerini korumanız gerekiyorsa ArrayCreatingInputMerger daha iyi bir seçenek olabilir.

ArrayOluşturan GirintiBirleştirme

Yukarıdaki örnekte, tüm bitki isimlerinin çalışanlarından elde edilen çıktıları korumak istediğimizi düşünerek 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 bir dizi olur.

Zincirdeki bir sonraki işe farklı çıkışlar geçiren üç işi gösteren şema. Bir sonraki işe, çıkış anahtarlarının her biri için bir tane olmak üzere üç dizi iletilir. Her dizinin tek bir üyesi vardır.

Herhangi bir anahtar çakışması varsa karşılık gelen değerler bir dizide birlikte gruplandırılır.

Çıkışları zincirdeki bir sonraki işe aktaran üç işi gösteren şema. Bu durumda, bu işlerden ikisi aynı anahtarla çıktı üretir. Bir sonraki iş, her anahtar için bir tane olmak üzere iki dizi iletilir. Bu anahtara sahip iki çıkış olduğu için bu dizilerden birinin iki üyesi vardır.

Zincir Bağlantı ve Çalışma Durumları

OneTimeWorkRequest zincirleri, çalışmaları başarıyla tamamlandığı (yani bir Result.success() döndürdüğü) sürece sırayla yürütülür. İş istekleri çalışırken başarısız olabilir veya iptal edilebilir. Bu durum, bağımlı iş istekleri üzerinde aşağı yönlü etkilere yol açar.

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

İş zincirini gösteren şema. İlk iş sıraya alınır ve art arda yapılan tüm işler ilk iş bitene kadar engellenir.

Sıraya girdikten ve tüm iş kısıtlamaları karşılandıktan sonra ilk iş isteği çalışmaya başlar. İş, kök OneTimeWorkRequest veya List<OneTimeWorkRequest> kök dizininde başarıyla tamamlanırsa (yani bir Result.success() döndürür) sonraki bağımlı iş istekleri grubu sıraya alınır.

İş zincirini gösteren şema. İlk iş başarılı oldu ve onun iki yakını kuyruğa alındı. Kalan işler, kendi önceki işlerinin tamamlanması için engellenir.

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

Bir çalışan, çalışma isteğinizi işlerken hata oluşursa bu isteği tanımladığınız bir geri yükleme politikasına göre yeniden deneyebilirsiniz. Bir zincirin parçası olan bir isteğin yeniden denenmesi, sadece o isteğin kendisine sağlanan giriş verileriyle yeniden deneneceği anlamına gelir. Paralel olarak çalışan çalışmalar bu durumdan etkilenmeyecek.

İş zincirini gösteren şema. İşlerden biri başarısız oldu, ancak tanımlanmış bir geri yükleme politikası vardı. Bu iş, uygun süre geçtikten sonra tekrar çalıştırılır. Zincirde bu işlerden sonra gelen işler, 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 Yükleme Politikası bölümüne bakın.

Bu yeniden deneme politikası tanımlanmamışsa veya tükenmişse ya da OneTimeWorkRequest öğesinin Result.failure() değerini döndürdüğü bir duruma erişirseniz bu iş isteği ve bağımlı tüm iş istekleri FAILED. olarak işaretlenir

İş zincirini gösteren şema. Bir iş başarısız oldu ve tekrar denenemiyor. Sonuç olarak, zincirde bu işlemden sonra gelen tüm işler de başarısız olur.

OneTimeWorkRequest iptal edildiğinde de aynı mantık geçerlidir. Bağımlı iş istekleri de CANCELLED olarak işaretlenir ve bunların çalışmaları yürütülmez.

İş zincirini gösteren şema. Bir iş iptal edildi. Bunun sonucunda, zincirde bu işlemden sonra gelen tüm işler de iptal edilir.

Başarısız olan veya iptal edilmiş iş istekleri olan bir zincire daha fazla iş isteği eklerseniz yeni eklenen çalışma isteğiniz de sırasıyla FAILED veya CANCELLED olarak işaretlenir. Mevcut bir zincirin çalışmasını genişletmek istiyorsanız MevcutWorkPolicy'de APPEND_OR_REPLACE bölümüne bakın.

İş istekleri zincirleri oluşturulurken bağımlı iş istekleri, işlerin her zaman zamanında tamamlanmasını sağlamak için yeniden deneme politikaları tanımlamalıdır. Başarısız olan iş istekleri, eksik zincirlere ve/veya beklenmedik durumla sonuçlanabilir.

Daha fazla bilgi için İşi İptal Etme ve Durdurma bölümünü inceleyin.