Actix มี supervisor ที่ช่วย restart actor ใต้บังคับ แต่บางทีมันก็ไม่ restart 😹
เท่าที่ทราบบางอย่างต้องส่ง Die (message) ไปให้ actor เวลามีอะไรพัง actor ต้อง implement ตัว handle Die message handler ใน handler ต้องเรียก ctx.stop (context stop) เมื่อ “Actor::stopping(…) == Running::Stop” poll function จะคืนค่า Poll::Ready จากนั้น supervisor ก็จะไปสั่ง restart ได้
ในกรณีของผมพวกนี้ทำงานไม่ได้เพราะสองอย่างคือ
-
Actor หยุดแบบไม่ได้เรียก stopped function ดังนั้นทำให้ actor ไม่มีโอกาสได้ handle Die message เลย
-
Actor ใช้ CPU เพราะเกิดกรณีที่ผิดพลาด ดังนั้น poll function ก็โดน block ไปเลย ทำให้ actor ไม่สามารถ handle Die message.
ผมแก้กรณีแรกโดยเรียก tokio::time::sleep และกรณีที่สองโดยเรียก break ออกจาก loop
ปล. ผมไม่มั่นใจเรื่องที่เขียนเลย ถ้าผมเข้าใจอะไรผิดก็ให้ชี้แนะด้วยครับ