오늘도 더 나은 코드를 작성하였습니까?

WorkChaining 본문

Android Jetpack Architecture/Workmanager

WorkChaining

hik14 2021. 3. 12. 16:52

WorkManager를 사용하면 여러 종속된 작업(앞선 작업이 끝나서 결과를 뒤에 오는 작업이 필요로 하거나 반드시 선수되어야 하는 작업이 있어야 되는경우)을 지정하고 실행 순서를 정의하는 작업 체인을 만들고 큐에 추가할 수 있습니다.

 

체이닝 기능은 특정 순서로 여러 작업을 실행해야 할 때 특히 유용합니다. 순서!

 

작업 체인 만들기

시작 

WorkContinuation 인스턴스를 반환하는 

- WorkManager.beginWith(OneTimeWorkRequest)

- WorkManager.beginWith(List<OneTimeWorkRequest>

 

연결하기

then(OneTimeWorkRequest) 또는 then(List<OneTimeWorkRequest>)을 통해 종속 인스턴스를 추가

 

작업실행

WorkContinuation.enqueue()

WorkManager.getInstance(myContext)
   // 아래 3개의 작업을 병렬적으로 실행
   .beginWith(listOf(plantName1, plantName2, plantName3))
   // 위 작업이 다 끝나고 나서 진행됨 순차적으로
   .then(cache)
   .then(upload)
   // Call enqueue to kick things off
   .enqueue()

 

이전 작업의 결과를 다음 작업의 입력으로 병합하여 넘겨주기

OneTimeWorkRequest 인스턴스를 체이닝하면 상위 작업 요청의 출력이 하위 요소에 입력으로 전달됩니다. 따라서 위 예에서 plantName1, plantName2, plantName3의 출력이 cache 요청에 입력으로 전달됩니다.

 

여러 상위 작업 요청의 입력을 관리하기 위해 WorkManager에서는 InputMer

ger를 사용

 

  • OverwritingInputMerger는 모든 입력의 키를 출력에 모두 추가하려고 시도합니다. 충돌이 발생하면이전에 설정한 키를 덮어씁니다.

  • ArrayCreatingInputMerger는 입력을 병합하려고 시도하며 필요한 경우 배열을 생성

OverwritingInputMerger (key: value)

식물 입력에 각각의 변수 이름("plantName1", "plantName2", "plantName3")과 일치하는 키가 있으면 cache worker에 전달된 데이터에는 키-값 쌍이 세 개 있습니다.

plantName1 이 elm에서 마지막(최신)에 값으로 다음 worker에게 넘어간다.

작업 요청은 동시에 실행되므로 요청이 실행되는 순서는 보장되지 않는다

위 예에서 plantName1은 마지막으로 작성된 값에 따라 "tulip" 또는 "elm" 값을 보유할 수 있습니다.

키 충돌 가능성이 있고 병합에서 모든 출력 데이터를 유지해야 한다면 ArrayCreatingInputMerger를 사용한다.

 

ArrayCreatingInputMerger (key : ArrayOf(value) )

모든 식물 이름 작업자의 출력을 유지하려면 ArrayCreatingInputMerger를 사용한다.

val cache: OneTimeWorkRequest = OneTimeWorkRequestBuilder<PlantWorker>()
   .setInputMerger(ArrayCreatingInputMerger::class)
   .setConstraints(constraints)
   .build()

 

체이닝 및 작업 상태

OneTimeWorkRequest 체인은 작업이 성공적으로 완료되면, 즉 Result.success()를 반환하면 순차적으로 실행됩니다.

WorkRequest은 실행 중에 실패하거나 취소될 수 있어서 종속 작업 요청에 후속 영향을 미칩니다.

 

제약조건및 지연 타이밍이 만족되면 최상위 작업의 상태가 ENQUEUED 상태면 하위 작업들은 전부 BLOCKED 상태이다. 

 

 

첫 번째 작업이 완료되고 이후 하위 2개의 작업이 병렬 실행된다. 

 첫번째 작업이 Result.success()를 반환하면 다음 종속 작업 요청 세트가 큐에 추가된다.

위와 동일하게 마지막 작업까지 실행한다.

 오류가 생길때 

백오프 정책 -> Result.retry()

 

Worker 작업을 처리하는 동안 오류가 발생하면 개발자가 정의한 백오프 정책에 따라 요청을 재시도할 수 있습니다.

체인에 속한 요청을 재시도하면 제공된 입력 데이터로 해당 요청만 재시도됩니다. 동시에 실행되는 모든 작업은 영향을 받지 않습니다.

 

아래에서 오른쪽 노드만 이전 작업의 결과를 가지고 재실행되고 왼쪽 작업은 그대로 실행된다.

 

백오프 정책 -> Result.failure(), 재시도 정책이 정의되어 있지 않거나 없는 경우

여기서 왼쪽 작업들은 순차적으로 잘 실행되고 있는것을 주의해서 봐야한다.

 

 

작업의 취소

2단계 작업 오른쪽 노드 취소시 하위 종속 작업들 전부 취소된다.

여기서 왼쪽 작업들은 순차적으로 잘 실행되고 있는것을 주의해서 봐야한다

 

 

실패하거나 취소된 작업 요청이 있는 체인에 더 많은 작업 요청을 추가하면 새로 추가된 작업 요청도 각각 FAILED 또는 CANCELLED 된다.

기존 체인의 작업을 확장하려는 경우 ExistingWorkPolicy의 APPEND_OR_REPLACE를 사용한다.

 

작업 요청 체인을 만들 때 종속 작업 요청은 작업이 항상 적시에 완료되도록 재시도 정책을 정의해야 합니다.

작업 요청에 실패하면 체인이 불완전하거나 예상치 못한 상태가 될 수 있습니다.

'Android Jetpack Architecture > Workmanager' 카테고리의 다른 글

Worker 중간 진행률 및 관찰  (0) 2021.03.12
작업 상태 확인후 관리하고 취소까지  (0) 2021.03.12
WorkRequest 만들기.  (0) 2021.03.12
Workmanager codelab  (0) 2021.03.12
Workmanager 기본 사용법  (0) 2021.03.11