Study
Akka

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.

Editor Latihan

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.