Study
Akka

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.

Editor Latihan

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.