Advertisement
Guest User

Actors

a guest
Mar 6th, 2014
109
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Scala 2.14 KB | None | 0 0
  1. object BackendActor {
  2.   def EventActor1Pool = Props(classOf[EventActor1]).withDispatcher("file-dispatcher").withRouter(SmallestMailboxRouter(150))
  3.   .
  4.   .
  5.   .
  6.   def senderPool: Props = Props(classOf[SenderActor]).withDispatcher("file-dispatcher").withRouter(SmallestMailboxRouter(600))
  7. }
  8.  
  9. case class Packet(uri: String, payload: String, attempts: Int = 0) extends Serializable
  10.  
  11. trait Sender extends Logging {
  12.   val HttpOpts = List(HttpOptions.connTimeout(1000), HttpOptions.readTimeout(5000))
  13.  
  14.   def send(packet: Packet): Unit = {
  15.     logger info s"Sending the following packet -> $packet."
  16.     val responseCode = Http
  17.       .postData(packet.uri, packet.payload)
  18.       .header("content-type", "application/json")
  19.       .options(HttpOpts)
  20.       .responseCode
  21.  
  22.     if (responseCode == 200)
  23.       logger info s"Succesfully sent $packet"
  24.     else
  25.       logger error s"Failed with http status code $responseCode while trying to send $packet."
  26.   }
  27. }
  28.  
  29. class SenderActor extends Actor with Sender {
  30.   val retryDelay = 60 // seconds
  31.   val maxRetries = 3
  32.  
  33.   def receive = LoggingReceive {
  34.     case Packet(uri, payload, attempts)
  35.       try {
  36.         send(Packet(uri, payload, attempts))
  37.       } catch {
  38.         case _: java.net.SocketTimeoutException => {
  39.           if (attempts < maxRetries) {
  40.             val newPacket = Packet(uri, payload, attempts + 1)
  41.             val delay = newPacket.attempts * retryDelay
  42.             ActorsSystem.schedule(delay, newPacket)
  43.             logger error s"Sending operation failed. Retrying in $delay seconds."
  44.           } else
  45.             logger error s"Failed to register: $payload. "
  46.         }
  47.         case exception: Exception => {
  48.           logger error (s"Unexpected exception throwed while trying to send: $payload", exception)
  49.         }
  50.       }
  51.     case unknown ⇒ logger warn unknown.toString
  52.   }
  53. }
  54.  
  55. class Event1Actor extends Actor with ActorLogging {
  56.   def receive = LoggingReceive {
  57.     case Event1(strategy, payload)
  58.       val uri = s"${Configuration.Url}/$strategy"
  59.       ActorsSystem("sender") ! Packet(uri, payload)
  60.     case unknown ⇒ log warning unknown.toString
  61.   }
  62. }
  63. .
  64. .
  65. .
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement