WorkManager ช่วยให้คุณสร้างและจัดคิวงานแบบเป็นลําดับซึ่งระบุงานที่ต้องพึ่งพาหลายรายการและกำหนดลำดับที่ควรทำงาน ฟังก์ชันการทำงานนี้จะมีประโยชน์อย่างยิ่งเมื่อคุณต้องเรียกใช้งานหลายรายการตามลําดับที่เจาะจง
หากต้องการสร้างเชนงาน คุณสามารถใช้ WorkManager.beginWith(OneTimeWorkRequest)
หรือ WorkManager.beginWith(List<OneTimeWorkRequest>)
ซึ่งแต่ละรายการจะแสดงอินสแตนซ์ของ WorkContinuation
จากนั้นจะใช้ WorkContinuation
เพื่อเพิ่มอินสแตนซ์ OneTimeWorkRequest
ที่เกี่ยวข้องได้โดยใช้ then(OneTimeWorkRequest)
หรือ then(List<OneTimeWorkRequest>)
การเรียกใช้ WorkContinuation.then(...)
ทุกครั้งจะแสดงผลอินสแตนซ์ WorkContinuation
ใหม่ หากคุณเพิ่มอินสแตนซ์ List
ของ OneTimeWorkRequest
คำขอเหล่านี้อาจทํางานพร้อมกันได้
สุดท้าย คุณสามารถใช้วิธี WorkContinuation.enqueue()
เพื่อenqueue()
WorkContinuation
หลายรายการ
เรามาดูตัวอย่างกัน ในตัวอย่างนี้ งานของผู้ปฏิบัติงาน 3 งานที่แตกต่างกันคือ ให้กำหนดค่าให้เรียกใช้ (อาจดำเนินการพร้อมกัน) จากนั้นระบบจะรวมผลลัพธ์ของโหนดเหล่านี้และส่งต่อไปยังงานโหนดแคช สุดท้าย ระบบจะส่งเอาต์พุตของงานนั้นไปยังเวิร์กเกอร์การอัปโหลด ซึ่งจะอัปโหลดผลลัพธ์ไปยังเซิร์ฟเวอร์ระยะไกล
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();
การผสานอินพุต
เมื่อคุณต่อสตริงอินสแตนซ์ OneTimeWorkRequest
ระบบจะส่งเอาต์พุตของคำของานหลักเป็นอินพุตไปยังรายการย่อย ดังนั้นในตัวอย่างข้างต้น
ระบบจะส่งเอาต์พุตของ plantName1
, plantName2
และ plantName3
ในรูปแบบ
ข้อมูลที่ป้อนในคำขอ cache
WorkManager จะใช้เพื่อจัดการอินพุตจากคำของานระดับบนสุดหลายรายการ
InputMerger
InputMerger
ที่ WorkManager มีให้มีอยู่ 2 ประเภท ได้แก่
OverwritingInputMerger
พยายามเพิ่มคีย์ทั้งหมดจากอินพุตทั้งหมดไปยังเอาต์พุต ในกรณีที่เกิดความขัดแย้ง จะเป็นการเขียนทับคีย์ที่ตั้งค่าไว้ก่อนหน้านี้ArrayCreatingInputMerger
พยายามผสานอินพุตและการสร้างอาร์เรย์เมื่อจำเป็น
หากคุณมีกรณีการใช้งานที่เจาะจงมากขึ้น ก็สามารถเขียนขึ้นเองโดยการแยกคลาสย่อย
InputMerger
OverwritingInputMerger
OverwritingInputMerger
เป็นวิธีการผสานเริ่มต้น หากมีคีย์ทับซ้อนกันในการผสาน ระบบจะเขียนทับค่าล่าสุดของคีย์นั้นในข้อมูลเอาต์พุตที่ได้
เช่น หากพืชอินพุตแต่ละรายการมีคีย์ตรงกับอินพุตของพืชนั้นๆ
ชื่อตัวแปร ("plantName1"
, "plantName2"
และ "plantName3"
) จากนั้น
ข้อมูลที่ส่งไปยังผู้ปฏิบัติงาน cache
จะมีคู่คีย์-ค่า 3 คู่
หากมีข้อขัดแย้ง ให้พนักงานคนสุดท้ายที่ "สำเร็จ" และคุณค่าของงานนั้นสำเร็จ
จะส่งไปยัง cache
เนื่องจากคำขอทำงานทำงานควบคู่กัน คุณจึงไม่สามารถรับประกัน
ลำดับการเรียกใช้ ในตัวอย่างข้างต้น plantName1
อาจมีค่าเป็น "tulip"
หรือ "elm"
ทั้งนี้ขึ้นอยู่กับค่าที่เขียนไว้เป็นค่าสุดท้าย หากคีย์ขัดแย้งกันและคุณต้องเก็บเอาต์พุตทั้งหมดไว้
ในการควบรวมกิจการ ArrayCreatingInputMerger
อาจเป็นตัวเลือกที่ดีกว่า
การผสานอินพุตของอาร์เรย์ที่สร้าง
จากตัวอย่างข้างต้น สมมติว่าเราต้องการรักษาผลผลิตจากพืชทั้งหมด
ชื่อผู้ปฏิบัติงาน เราควรใช้ ArrayCreatingInputMerger
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
จะจับคู่แต่ละคีย์กับอาร์เรย์ หากแต่ละแป้น
ไม่ซ้ำกัน ดังนั้นผลลัพธ์ของคุณจะเป็นชุดอาร์เรย์ที่มีองค์ประกอบเดียว
หากมีคีย์ที่ทับซ้อนกัน ระบบจะจัดกลุ่มค่าที่เกี่ยวข้องไว้ในอาร์เรย์
สถานะการเชื่อมโยงและสถานะการทํางาน
เชนของ OneTimeWorkRequest
จะทำงานตามลำดับตราบเท่าที่มีงานดังกล่าว
เสร็จสมบูรณ์ (กล่าวคือ แสดง Result.success()
) ที่ทำงาน
คำขออาจล้มเหลวหรือถูกยกเลิกในขณะที่เรียกใช้ ซึ่งส่งผลต่อดาวน์สตรีม
คำขอการทำงานที่ขึ้นต่อกัน
เมื่อ OneTimeWorkRequest
แรกอยู่ในคิวของคำของาน
คำของานลำดับต่อมาทั้งหมดจะถูกบล็อกจนกว่างานชิ้นแรกจะเสร็จสิ้น
เสร็จสมบูรณ์แล้ว
เมื่อจัดคิวและข้อจำกัดของงานทั้งหมดได้รับการปฏิบัติตามแล้ว คำของานแรกจะเริ่มทำงาน หากงานเสร็จสมบูรณ์ในรูท OneTimeWorkRequest
หรือ List<OneTimeWorkRequest>
(นั่นคือ ระบบแสดงผล Result.success()
) ระบบจะจัดคิวคําของานที่เกี่ยวข้องชุดถัดไป
ตราบใดที่คำของานแต่ละรายการดำเนินการเสร็จสมบูรณ์ รูปแบบเดียวกันนี้ เผยแพร่ผ่านคำของานที่เหลือของคุณจนกว่างานทั้งหมดจะเกิดขึ้นใน เชนธุรกิจเสร็จสมบูรณ์แล้ว แม้ว่านี่จะเป็นกรณีที่ง่ายที่สุดและมักเลือกใช้อยู่ แต่ข้อผิดพลาด ก็สำคัญไม่แพ้กันที่ต้องจัดการ
เมื่อเกิดข้อผิดพลาดขณะที่ผู้ปฏิบัติงานกำลังประมวลผลคำของานของคุณ คุณจะทำสิ่งต่อไปนี้ได้ ลองส่งคำขอนั้นอีกครั้งตามนโยบาย Backoff การลองใช้คำขอที่เป็นส่วนหนึ่งของเชนอีกครั้งหมายความว่า คำขอดังกล่าวจะ ลองอีกครั้งโดยใช้ข้อมูลอินพุตที่ให้ไว้ งานใดๆ ที่ดำเนินการพร้อมกันจะ จะไม่ได้รับผลกระทบ
ดูข้อมูลเพิ่มเติมเกี่ยวกับการกําหนดกลยุทธ์การลองใหม่ที่กำหนดเองได้ที่นโยบายการลองใหม่และเวลาพัก
หากนโยบายการลองอีกครั้งนั้นไม่มีการกำหนดหรือหมดแล้ว หรือคุณไปถึงสถานะที่ OneTimeWorkRequest
แสดงผลเป็น Result.failure()
ระบบจะทำเครื่องหมายคำของานนั้นและคำของานที่เกี่ยวข้องทั้งหมดเป็น FAILED.
หลักการเดียวกันนี้ยังใช้กับการยกเลิก OneTimeWorkRequest
ด้วย บุคคลใดก็ได้
คำของานจะมีการทำเครื่องหมายเป็น CANCELLED
ด้วยเช่นกันและระบบจะไม่ดำเนินการตามคำของาน
โปรดทราบว่าหากคุณต้องการต่อท้ายคำของานเพิ่มเติมสำหรับเชนธุรกิจที่ดำเนินการไม่สำเร็จ หรือ
ได้ยกเลิกคำของาน คำของานที่เพิ่มเข้ามาใหม่ของคุณจะ
FAILED
หรือ CANCELLED
ตามลำดับ หากต้องการขยายเวลาทำงานของเชนที่มีอยู่ โปรดดู APPEND_OR_REPLACE
ใน ExistingWorkPolicy
เมื่อสร้างคำของานแบบเป็นลำดับ โปรดกำหนดนโยบายการลองอีกครั้งสำหรับคำของานที่เกี่ยวข้องเพื่อให้งานเสร็จสมบูรณ์อย่างทันท่วงทีเสมอ คำของานที่ไม่สำเร็จอาจทำให้เชนธุรกิจไม่สมบูรณ์และ/หรือมีสถานะที่ไม่คาดคิด
สำหรับข้อมูลเพิ่มเติม โปรดดูการยกเลิกและการหยุด ที่ทำงาน