Timer & Scheduling Pesan dalam Actor
Penjelasan
Kadang actor perlu mengirim pesan ke dirinya sendiri setelah jeda waktu tertentu, atau secara berkala berulang — misalnya untuk mengecek timeout, mengirim heartbeat, atau polling berkala. Akka Typed menyediakan `Behaviors.withTimers` yang membungkus behavior dan menyediakan akses ke `TimerScheduler`. Ada dua jenis timer utama: `startSingleTimer(key, pesan, durasi)` untuk pesan tertunda sekali (one-shot), dan `startTimerWithFixedDelay(key, pesan, durasi)` untuk pesan berulang dengan jeda tetap antar pengiriman. Setiap timer diberi `key` unik yang bisa dipakai untuk membatalkannya lewat `cancel(key)` sebelum waktunya, atau timer otomatis dibatalkan jika actor berhenti/di-restart. Pola umum: dipakai untuk implementasi timeout pada ask pattern manual, session yang expired otomatis, atau job terjadwal sederhana tanpa perlu library scheduler eksternal. Penting diingat, timer terikat pada actor instance tertentu — kalau actor di-restart oleh supervisor, timer lama otomatis hilang dan biasanya perlu dijadwalkan ulang di awal behavior baru.
Contoh Konsep
import akka.actor.typed.Behavior
import akka.actor.typed.scaladsl.Behaviors
import scala.concurrent.duration._
object Heartbeat {
sealed trait Pesan
private case object Detak extends Pesan
def apply(): Behavior[Pesan] = Behaviors.withTimers { timers =>
timers.startTimerWithFixedDelay("detak-jantung", Detak, 2.seconds)
Behaviors.receiveMessage {
case Detak =>
println("Detak...")
Behaviors.same
}
}
}
Praktikum
Lengkapi actor SesiTimeout yang menjadwalkan timer sekali (single timer) berdurasi 5 detik dengan pesan Kadaluarsa, dan mencetak pesan sesi berakhir saat timer terpicu.
Ketik/edit bebas di sini untuk latihan — kode ini tidak dijalankan.
Tips
Selalu pakai key timer yang deskriptif dan konsisten, terutama kalau ada beberapa timer aktif dalam satu actor — key yang sama otomatis menggantikan timer lama, jadi salah pakai key bisa membuat timer yang seharusnya terpisah malah saling menimpa.