Actor Lifecycle (Spawn, Stop, Watch)
Penjelasan
Actor punya siklus hidup yang dikelola lewat `ActorContext`. Untuk membuat actor anak, gunakan `context.spawn(behavior, "nama")` yang mengembalikan `ActorRef` ke actor baru tersebut — actor anak ini otomatis menjadi bagian dari hierarki di bawah actor pembuatnya. Untuk menghentikan actor, ada dua cara: actor bisa menghentikan dirinya sendiri dengan mengembalikan `Behaviors.stopped` dari handler pesan, atau actor induk bisa menghentikan anaknya lewat `context.stop(childRef)` (catatan: `context.stop` hanya bisa dipakai induk terhadap anak langsungnya, bukan actor sembarang). Untuk memantau actor lain (termasuk yang bukan anak langsung), pakai `context.watch(actorRef)` — ini membuat actor pengamat menerima sinyal `Terminated` ketika actor yang diawasi berhenti, berguna untuk membersihkan referensi atau memicu tindakan lanjutan (misal restart actor pengganti). Memahami lifecycle penting supaya resource actor yang sudah tidak dipakai benar-benar dibersihkan, dan supaya sistem bisa bereaksi terhadap actor yang mati tak terduga.
Contoh Konsep
import akka.actor.typed.{Behavior, Terminated}
import akka.actor.typed.scaladsl.Behaviors
object Pekerja {
sealed trait Pesan
case object Selesai extends Pesan
def apply(): Behavior[Pesan] = Behaviors.receiveMessage {
case Selesai => Behaviors.stopped
}
}
object Pengawas {
sealed trait Pesan
case object MulaiPekerja extends Pesan
def apply(): Behavior[Pesan] = Behaviors.setup { context =>
Behaviors.receiveMessage {
case MulaiPekerja =>
val pekerja = context.spawn(Pekerja(), "pekerja-1")
context.watch(pekerja)
pekerja ! Pekerja.Selesai
Behaviors.same
}.receiveSignal {
case (_, Terminated(ref)) =>
println(s"Pekerja $ref sudah berhenti")
Behaviors.same
}
}
}
Praktikum
Lengkapi actor Manajer yang men-spawn actor anak Tugas saat menerima pesan Mulai, mengawasinya dengan watch, dan mencetak pesan saat menerima signal Terminated.
Ketik/edit bebas di sini untuk latihan — kode ini tidak dijalankan.
Tips
Ingat context.stop hanya berlaku untuk anak langsung — kalau ingin menghentikan actor sembarang dari jauh, kirim pesan kustom yang membuat actor tersebut mengembalikan Behaviors.stopped sendiri.