Zincirleme iş

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

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

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

Her WorkContinuation.then(...) çağrısı, yeni bir WorkContinuation örneği döndürür. OneTimeWorkRequest örnekten List tanesini eklerseniz bu istekler paralel olarak ç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, paralel olarak çalışacak şekilde yapılandırılmıştı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 çıktısı bir yükleme Çalışanına iletilir. Çalışan, sonuçları uzaktaki 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 örnek zincirini bağladığınızda, üst iş isteklerinin çıkışı alt öğelere giriş olarak iletilir. Dolayısıyla, yukarıdaki örnekte plantName1, plantName2 ve plantName3 çıkışları, cache isteğine giriş 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, önceden ayarlanan anahtarların üzerine yazılır.

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

Daha spesifik bir kullanım alanınız varsa InputMerger alt sınıfına geçerek kendi kullanım alanınızı yazabilirsiniz.

Üzerine YazmaInputMerger

OverwritingInputMerger, varsayılan birleştirme yöntemidir. Birleştirmede anahtar çakışmaları varsa anahtarın en son değeri, sonuçta ortaya çıkan çıkış verilerindeki tüm önceki sürümlerin üzerine yazılır.

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

Zincirdeki bir sonraki işe farklı çıktılar aktaran üç işin gösterildiği şema. Üç çıkışın hepsi farklı anahtarlara sahip olduğundan sonraki iş üç anahtar/değer çifti alır.

Çakışma varsa "kazanır"ı tamamlayan son çalışan ve değeri cache değerine iletilir.

Çıkışları zincirdeki bir sonraki işe geçiren üç işin gösterildiği şema. Bu durumda, bu işlerden ikisi aynı anahtara sahip çıkışlar üretir. Sonuç olarak sonraki iş, çakışan çıkışlardan biri atlanmış iki anahtar/değer çifti alır.

İş istekleriniz paralel olarak yürütüldüğünden, işleyiş sırasına dair garanti verilmez. Yukarıdaki örnekte plantName1, hangi değerin son yazıldığına bağlı olarak "tulip" veya "elm" değerini alabilir. Önemli bir çakışma olasılığınız varsa ve tüm çıkış verilerini bir birleştirmede korumanız gerekiyorsa ArrayCreatingInputMerger daha iyi bir seçenek olabilir.

DiziOluşturmaGiriş Birleştirme

Yukarıdaki örnekte, İşçi isimli tüm bitki isimlerinden elde edilen çıktıları 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şler. Anahtarların her biri benzersizse sonuç, tek öğeli bir diziden oluşur.

Zincirdeki bir sonraki işe farklı çıktılar aktaran üç işin gösterildiği şema. Sonraki işe, çıkış anahtarlarının her biri için bir tane olmak üzere üç dizi iletilir. Her dizinin tek bir üyesi vardır.

Anahtar çakışmaları varsa bunlara karşılık gelen değerler bir dizide birlikte gruplandırılır.

Çıkışları zincirdeki bir sonraki işe geçiren üç işin gösterildiği şema. Bu durumda, bu işlerden ikisi aynı anahtara sahip çıkışlar üretir. Sonraki işe, her anahtar için bir tane olmak üzere iki dizi iletilir. Bu anahtara sahip iki çıkış olduğu için dizilerden birinde iki üye vardır.

Zincirleme ve Çalışma Durumları

OneTimeWorkRequest zincirleri, çalışmaları başarılı bir şekilde tamamlandığı (yani Result.success() değeri döndürdüğü) sürece sıralı olarak yürütülür. İş istekleri çalışırken başarısız olabilir veya iptal edilebilir. Bu durum, bağımlı iş isteklerini aşağı yönde etkiler.

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

Bir iş zincirini gösteren şema. İlk iş sıraya alınır; sonraki işlerin tümü, ilk iş bitene kadar engellenir.

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

Bir iş zincirini gösteren şema. İlk iş başarılı oldu ve bundan sonraki iki takipçi sıraya alındı. Kalan işler, önceki işlerini tamamlamaları engellenir.

Her iş isteği başarıyla tamamlandığı sürece bu kalıp, zincirdeki tüm çalışmalar tamamlanana dek iş istekleri zincirinizin geri kalanında yayılır. En basit ve genellikle tercih edilen durum bu olsa da hata durumlarının ele alınması da aynı derecede önemlidir.

Bir çalışan iş 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ği yeniden denemek, yalnızca bu isteğin kendisine sağlanan giriş verileriyle yeniden deneneceği anlamına gelir. Paralel olarak yürütülen çalışmalar bu değişiklikten etkilenmez.

Bir iş zincirini gösteren şema. İşlerden biri başarısız oldu, ancak bir geri çekme politikası tanımlanmış. Söz konusu iş, uygun süre geçtikten sonra yeniden çalışır. Zincirde ondan sonra gelen işler, başarılı bir şekilde çalışana kadar engellenir.

Özel yeniden deneme stratejilerini tanımlama hakkında daha fazla bilgi için Yeniden Deneme ve Geri Alma Politikası'nı inceleyin.

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

Bir iş zincirini gösteren şema. Bir iş başarısız olduğu için yeniden denenemiyor. Sonuç olarak zincirde kendisinden sonra gelen tüm işler de başarısız olur.

OneTimeWorkRequest iptal edildiğinde de aynı mantık geçerlidir. Tüm bağımlı çalışma istekleri de CANCELLED olarak işaretlenir ve bu isteklerin çalışmaları yürütülmez.

Bir iş zincirini gösteren şema. Bir iş iptal edildi. Sonuç olarak, zincirde daha sonra bulunan tüm işler de iptal edilir.

Başarısız olan veya iş isteklerini iptal eden 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 MevcutWorkPolicy'de APPEND_OR_REPLACE bölümüne bakın.

İş istekleri zincirleri oluşturulurken, bağımlı iş istekleri, işin her zaman zamanında tamamlanmasını sağlamak için yeniden deneme politikaları tanımlamalıdır. Başarısız iş istekleri, zincirlerin tamamlanmamasına ve/veya beklenmeyen bir duruma yol açabilir.

Daha fazla bilgi için Çalışmayı İptal Etme ve Durdurma bölümüne bakın.