Skip to content

Instantly share code, notes, and snippets.

@Fawers
Last active July 22, 2022 21:28
Show Gist options
  • Save Fawers/c09f14bbece934ad4fe5e351d029b7f5 to your computer and use it in GitHub Desktop.
Save Fawers/c09f14bbece934ad4fe5e351d029b7f5 to your computer and use it in GitHub Desktop.
timers and schedulers
import java.util.Date
import akka.actor._
import scala.concurrent.duration._
class TimedActor extends Actor with ActorLogging {
override def receive: Receive = onTimer(None, None)
def onTimer(msgReceived: Option[Date], oldTimer: Option[Cancellable]): Receive = {
case msg =>
oldTimer foreach (_.cancel())
implicit val dispatcher = context.system.dispatcher
val timer = context.system.scheduler.scheduleOnce(1 second) {
msgReceived foreach { d =>
if (new Date().getTime() - d.getTime() > 1000) {
log.info("commiting suicide by poison pill")
self ! PoisonPill
}
}
}
log.info(s"I've safely received: $msg")
context.become(onTimer(Some(new Date), Some(timer)))
}
}
object Exercise extends App {
val system = ActorSystem("exercise")
val timed = system.actorOf(Props[TimedActor](), "timedActor")
(8 to 15) foreach { i =>
system.log.info("sending message")
timed ! s"Hello! [$i]"
Thread.sleep(i * 100)
}
system.terminate()
}
import java.util.Date
import akka.actor._
import scala.concurrent.duration._
case object Timeout
class TimedActor extends Actor with ActorLogging with Timers {
override def receive: Receive = {
case Timeout =>
log.info("Goodbye, world. You don't deserve me.")
self ! PoisonPill
case msg =>
timers.cancel("timeout")
log.info(s"I lived to receive another lovely message: $msg")
timers.startSingleTimer("timeout", Timeout, 1 second)
}
}
object Exercise extends App {
val system = ActorSystem("exercise")
val timed = system.actorOf(Props[TimedActor](), "timedActor")
(8 to 15) foreach { i =>
system.log.info("sending message")
timed ! s"Hello! [$i]"
Thread.sleep(i * 100)
}
system.terminate()
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment