Mengirim Pesan (tell) Antar Actor
Penjelasan
Cara paling dasar mengirim pesan ke actor adalah operator `!` (dibaca 'tell' atau 'bang'). Pengiriman ini bersifat asinkron dan fire-and-forget: pengirim tidak menunggu balasan, tidak tahu kapan pesan diproses, dan langsung lanjut ke baris kode berikutnya begitu pesan masuk ke mailbox tujuan. Setiap actor punya `ActorRef[T]` — referensi bertipe ke actor tersebut, bukan referensi langsung ke objek actor. ActorRef inilah yang dipakai untuk mengirim pesan (`actorRef ! Pesan(...)`), dan referensi ini aman dikirim ke actor lain karena tidak mengekspos state internal actor tujuan. Jika actor A ingin mengirim pesan ke actor B agar B membalas ke A, A perlu menyertakan `ActorRef` dirinya sendiri (biasanya lewat `context.self`) di dalam pesan yang dikirim, sehingga B tahu ke mana harus membalas. Pola tell cocok untuk komunikasi satu arah seperti notifikasi, logging, atau event yang tidak butuh respons langsung.
Contoh Konsep
import akka.actor.typed.{ActorRef, ActorSystem, Behavior}
import akka.actor.typed.scaladsl.Behaviors
object Pencatat {
sealed trait Pesan
case class Catat(teks: String) extends Pesan
def apply(): Behavior[Pesan] = Behaviors.receiveMessage {
case Catat(teks) =>
println(s"[LOG] $teks")
Behaviors.same
}
}
object Pengirim {
def apply(pencatat: ActorRef[Pencatat.Pesan]): Behavior[String] =
Behaviors.receiveMessage { pesan =>
pencatat ! Pencatat.Catat(s"diterima: $pesan")
Behaviors.same
}
}
Praktikum
Lengkapi actor Notifikasi yang menerima pesan Kirim(pesan: String, tujuan: ActorRef[String]) lalu meneruskan pesan tersebut ke tujuan memakai tell.
Ketik/edit bebas di sini untuk latihan — kode ini tidak dijalankan.
Tips
Jangan pernah mengekspos referensi objek actor secara langsung (misal lewat closure ke `this`) — selalu gunakan ActorRef yang disediakan Akka, karena ActorRef menjaga isolasi actor dan membuat pesan tetap thread-safe.