Advertisement
Guest User

Untitled

a guest
Jan 22nd, 2018
74
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Scala 2.17 KB | None | 0 0
  1. import akka.actor._
  2. import akka.pattern.{ask, pipe}
  3. import akka.util.Timeout
  4.  
  5. import scala.concurrent.duration._
  6. import scala.concurrent.{Await, Future, Promise}
  7.  
  8. def main(): Unit = {
  9.   implicit val system = ActorSystem("system")
  10.  
  11.   import system.dispatcher
  12.  
  13.   object Counter {
  14.     sealed trait Message
  15.     case class Inc(i: Int = 1) extends Message
  16.     case object Get extends Message
  17.     case class SetToken(token: String)
  18.  
  19.     case class Result(token: String, cnt: Int)
  20.  
  21.     case class Data(token: String, cnt: Int)
  22.   }
  23.  
  24.   import Counter._
  25.  
  26.   object TokenService {
  27.  
  28.     def getToken(): Future[String] = {
  29.       val res = Promise[String]
  30.       system.scheduler.scheduleOnce(1.second)(res.success("myToken"))
  31.       res.future
  32.     }
  33.   }
  34.  
  35.   class Counter extends Actor with Stash {
  36.     override def preStart(): Unit = {
  37.       super.preStart()
  38.       TokenService.getToken().map(SetToken).pipeTo(self)
  39.     }
  40.  
  41.     def running(state: Data): Receive = {
  42.       case Inc(i) =>
  43.         context.become(running(state.copy(cnt = state.cnt + 1)))
  44.       case Get =>
  45.         sender() ! Result(state.token, state.cnt)
  46.     }
  47.  
  48.     def initializing: Receive = {
  49.       case SetToken(token) =>
  50.         unstashAll()
  51.         context.become(running(Data(token, 0)))
  52.       case _ => stash()
  53.     }
  54.     override def receive: Receive = initializing
  55.   }
  56.   implicit val timeout = Timeout(5.seconds)
  57.  
  58.   class Worker(counter: ActorRef) extends Actor {
  59.     def receive: Receive = {
  60.       case "send" =>
  61.         counter ! Inc()
  62.         context.system.scheduler.scheduleOnce(100.millis)(self ! "send")
  63.       case "get" =>
  64.         val cnt = counter ? Get
  65.         cnt.mapTo[Int].pipeTo(sender())
  66.     }
  67.   }
  68.  
  69.   val counter: ActorRef = system.actorOf(Props(new Counter))
  70. //  val worker: ActorRef = system.actorOf(Props(new Worker(counter)))
  71.  
  72.  
  73. //  worker ! "send"
  74.  
  75.   counter ! Inc()
  76.   counter ! Inc()
  77.   counter ! Inc()
  78.   counter ! Inc()
  79.   val cnt = counter ? Get
  80.  
  81. //  Thread.sleep(1000)
  82.  
  83. //  val cnt: Future[Any] = worker ? "get"
  84.   cnt.mapTo[Result].foreach(i => println(s"count: $i"))
  85.  
  86.   Await.result(cnt, 5.seconds)
  87.  
  88.   Await.ready(system.terminate(), 5.seconds)
  89. }
  90.  
  91. main()
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement