Zincirleme iş

WorkManager, birden fazla bağımlı görevi belirten ve bunların 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ı Ç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 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 çı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 alt sınıfına geçerek kendi kullanım alanınızı yazabilirsiniz.

OverwritingInputMerger

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, 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ı çıktılar aktaran üç işin gösterildiği şema. Üç çıkışın tümü 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 oluşturur. Sonuç olarak sonraki iş, çakışan çıkışlardan biri atlanmış iki anahtar/değer çifti alı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.

DiziOluşturmaGiriş Birleştirme

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 halinde 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 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ş 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.

İlk iş isteği, sıraya eklendikten ve tüm iş kısıtlamaları karşılandıktan sonra ç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 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ı. Söz konusu iş, uygun süre geçtikten sonra yeniden çalışır. Bu iş başarıyla çalıştırılana kadar zincirdeki sonraki işler 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 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 zincirde kendisinden sonra gelen 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 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ış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.