Skip to content

Instantly share code, notes, and snippets.

@erangaeb
Last active March 4, 2016 09:12
Show Gist options
  • Save erangaeb/338911aa3ce56488533c to your computer and use it in GitHub Desktop.
Save erangaeb/338911aa3ce56488533c to your computer and use it in GitHub Desktop.
Actor with companion object
package actors
import actors.SenzSender.SenzMsg
import akka.actor.{Actor, Props}
import org.slf4j.LoggerFactory
import scala.concurrent.duration._
/**
* Companion object of ShareHandler actor
*/
object ShareHandler {
case class Share(msg: String)
case class ShareDone()
case class ShareFail()
case class ShareTimeout()
def props(msg: String): Props = Props(new ShareHandler(msg))
}
/**
* Share handler actor
* @param msg share message
*/
class ShareHandler(msg: String) extends Actor {
import context._
def logger = LoggerFactory.getLogger(this.getClass)
val senzSender = context.actorSelection("/user/SenzSender")
// send Share(msg) to actor in every 4 seconds
val shareCancellable = system.scheduler.schedule(0 milliseconds, 4 seconds, self, Share(msg))
// send timeout message after 12 seconds
val timeoutCancellable = system.scheduler.scheduleOnce(10 seconds, self, ShareTimeout)
override def preStart = {
logger.debug("Start actor: " + context.self.path)
}
override def receive: Receive = {
case Share(msg) =>
logger.debug("SHARE: " + msg)
senzSender ! SenzMsg(msg)
// TODO save msg in database
case ShareDone =>
// success
logger.debug("ShareDone")
// cancel timers
shareCancellable.cancel()
timeoutCancellable.cancel()
context.stop(self)
case ShareFail =>
// fail
logger.error("ShareFail")
shareCancellable.cancel()
timeoutCancellable.cancel()
context.stop(self)
case ShareTimeout =>
logger.error("Timeout")
// cancel scheduler
shareCancellable.cancel()
timeoutCancellable.cancel()
// stop the actor
context.stop(self)
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment