Study
Akka

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.

Editor Latihan

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.