Last active
July 22, 2022 21:28
-
-
Save Fawers/c09f14bbece934ad4fe5e351d029b7f5 to your computer and use it in GitHub Desktop.
timers and schedulers
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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() | |
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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