Advertisement
Guest User

Untitled

a guest
Jul 28th, 2015
196
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Scala 1.34 KB | None | 0 0
  1. package org.sbot.task
  2.  
  3.  
  4. import akka.actor.{Props, ActorSystem, ActorRef}
  5. import akka.kernel.Bootable
  6.  
  7. import scala.concurrent.{Future, ExecutionContext, Awaitable, Await}
  8. import scala.concurrent.duration._
  9. import akka.pattern.ask
  10.  
  11. /**
  12.  * @author : const_
  13.  */
  14.  
  15. case object Start
  16.  
  17. case object Stop
  18.  
  19. case object Pause
  20.  
  21. case object AskIfBlocking
  22.  
  23. abstract class TaskExecutor(tasks: IndexedSeq[ActorRef]) extends Bootable {
  24.  
  25.   val system = ActorSystem(getClass.getSimpleName)
  26.  
  27.   val blockingMap = createBlockingMap()
  28.  
  29.   val BlockingCheckTimeout = 10 seconds
  30.  
  31.   val TaskTimeout = 60 seconds
  32.  
  33.   private def createBlockingMap(): Map[ActorRef, Boolean] = {
  34.     tasks.map { task =>
  35.       val result = Await.result(task ? AskIfBlocking, BlockingCheckTimeout).asInstanceOf[Boolean]
  36.       task -> result
  37.     }.toMap
  38.   }
  39.  
  40.   def startup() = {
  41.     while(!system.isTerminated) {
  42.       loop()
  43.     }
  44.   }
  45.  
  46.   def shutdown() = {
  47.  
  48.   }
  49.  
  50.   def loop(): Int = {
  51.     tasks.foreach { task =>
  52.       blockingMap.get(task).map { blocking =>
  53.         if(blocking) {
  54.           Await.result(task ? Start, TaskTimeout)
  55.         } else {
  56.           task ! Start
  57.           None
  58.         }
  59.       } match {
  60.         case Some(sleep: Int) =>
  61.           Thread.sleep(sleep)
  62.         case _           => println("no block")
  63.       }
  64.     }
  65.     10
  66.   }
  67. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement