Zincirleme iş

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

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

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

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

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

Bir örnekle açıklayalım. Bu örnekte, 3 farklı Worker işi çalıştırılmak üzere (potansiyel olarak paralel olarak) yapılandırılmıştır. 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 işleyicisine iletilir. Yükleme işleyici, 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ştirmeleri

OneTimeWorkRequest örneklerini zincirlediğinizde, üst iş isteklerinin çıkışı alt öğelere giriş olarak iletilir. Dolayısıyla yukarıdaki örnekte plantName1, plantName2 ve plantName3 işlevlerinin çı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, daha önce ayarlanmış 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 sınıfını alt sınıflandırarak kendi sınıfınızı yazabilirsiniz.

OverwritingInputMerger

OverwritingInputMerger, varsayılan birleştirme yöntemidir. Birleştirme işleminde anahtar çakışması varsa bir anahtar için en son değer, elde edilen çıkış verilerindeki önceki tüm sürümlerin üzerine yazılır.

Örneğin, tesis girişlerinin her birinin ilgili 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 tümü farklı anahtarlara sahip olduğundan sonraki iş üç anahtar/değer çifti alır.

Çakışma varsa işlemi tamamlayan son işleyici "kazanır" ve değeri cache değerine iletilir.

Üç işin çıktıları zincirdeki bir sonraki işe ilettiğini gösteren şema. Bu durumda, bu işlerden ikisi aynı anahtara sahip çıkışlar oluşturur. Sonuç olarak, sonraki iş iki anahtar/değer çifti alır ve çakışan çıkışlardan biri atlanır.

İş istekleriniz paralel olarak çalıştırıldığı için çalıştırılma sırası konusunda garanti verilmez. Yukarıdaki örnekte plantName1, en son hangi değerin yazıldığına bağlı olarak "tulip" veya "elm" değerini tutabilir. Anahtar çakışması olasılığınız varsa ve bir birleştirme işleminde tüm çıkış verilerini korumanız gerekiyorsa ArrayCreatingInputMerger daha iyi bir seçenek olabilir.

ArrayCreatingInputMerger

Yukarıdaki örnekte, tüm plantname çalışanlarının çıktılarını korumak istediğimizden ArrayCreatingInputMerger kullanmamız gerekir.

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 bir anahtarı bir dizi ile eşleştirir. Anahtarların her biri benzersizse sonuç, tek öğeli diziler dizisi 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 birer dizi iletilir. Her dizi tek bir üyeye sahiptir.

Anahtar çakışması varsa ilgili değerler bir dizi içinde gruplandırılır.

Üç işin çıktıları zincirdeki bir sonraki işe ilettiğini gösteren şema. Bu durumda, bu işlerden ikisi aynı anahtara sahip çıkışlar oluşturur. Sonraki işe her anahtar için birer dizi iletilir. Bu anahtarla iki çıkış olduğu için bu dizilerden biri iki üyeye sahiptir.

Zincirleme ve Çalışma Durumları

OneTimeWorkRequest zincirleri, çalışmaları başarıyla tamamlandığı sürece (yani bir Result.success() döndürdükleri 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 aşağı yönlü etkilere neden olur.

İlk OneTimeWorkRequest, bir iş isteği zincirine eklendiğinde, 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; ilk iş tamamlanana kadar sonraki tüm işler engellenir.

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

Bir iş zincirini gösteren şema. İlk iş başarılı oldu ve hemen sonraki iki iş sıraya eklendi. Kalan işler, önceki işlerin tamamlanmasını beklerken engellenir.

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

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

Bir iş zincirini gösteren şema. Görevlerden biri başarısız oldu ancak geri yükleme politikası tanımlandı. Bu iş, uygun süre geçtikten sonra yeniden çalıştırılır. Bu iş başarıyla çalıştırılana kadar zincirdeki sonraki işler engellenir.

Özel yeniden deneme stratejileri tanımlama hakkında daha fazla bilgi için Yeniden deneme ve bekleme politikası başlıklı makaleyi inceleyin.

Bu yeniden deneme politikası tanımlanmamışsa veya tükenmişse ya da OneTimeWorkRequest işlevinin Result.failure() döndürdüğü bir duruma ulaşırsanız söz konusu 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 ve tekrar denenemez. Sonuç olarak, zincirdeki sonraki tüm işler de başarısız olur.

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

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

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

Bağımlı iş istekleri, iş isteklerinin her zaman zamanında tamamlanmasını sağlamak için iş isteği zincirleri oluşturulurken yeniden deneme politikalarını tanımlamalıdır. Başarısız çalışma istekleri, eksik zincirlere ve/veya beklenmedik duruma neden olabilir.

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