Created
March 4, 2016 09:38
-
-
Save erangaeb/3506743bf8c5969ad811 to your computer and use it in GitHub Desktop.
Actor with cake pattern dependency
This file contains hidden or 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
| package actors | |
| import actors.SenzSender.SenzMsg | |
| import akka.actor.{Actor, Props} | |
| import components.MsgDbComp | |
| import org.slf4j.LoggerFactory | |
| import scala.concurrent.duration._ | |
| /** | |
| * Actor as layered component, | |
| * this component contains db dependency | |
| */ | |
| trait MessageHandlerComp { | |
| // cake pattern dependency | |
| this: MsgDbComp => | |
| /** | |
| * Companion object of ShareHandler actor | |
| */ | |
| object MessageHandler { | |
| case class Share(msg: String) | |
| case class ShareDone() | |
| case class ShareFail() | |
| case class ShareTimeout() | |
| def props(msg: String): Props = Props(new MessageHandler(msg)) | |
| } | |
| /** | |
| * Share handler actor | |
| * @param msg share message | |
| */ | |
| class MessageHandler(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) | |
| // save msg in database | |
| msgDb.saveMsg(msg) | |
| 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