Akka for REST polling

前端 未结 1 485
误落风尘
误落风尘 2021-02-07 23:51

I\'m trying to interface a large Scala + Akka + PlayMini application with an external REST API. The idea is to periodically poll (basically every 1 to 10 minutes) a root URL and

相关标签:
1条回答
  • 2021-02-08 00:29

    Why not create a master poller, which then kicks of async resource requests on the schedule?

    I'm no expert using Akka, but I gave this a shot:

    The poller object that iterates through the list of resources to fetch:

    import akka.util.duration._
    import akka.actor._
    import play.api.Play.current
    import play.api.libs.concurrent.Akka
    
    object Poller {
      val poller = Akka.system.actorOf(Props(new Actor {
        def receive = {
          case x: String => Akka.system.actorOf(Props[ActingSpider], name=x.filter(_.isLetterOrDigit)) ! x
        }
      }))
    
      def start(l: List[String]): List[Cancellable] =
        l.map(Akka.system.scheduler.schedule(3 seconds, 3 seconds, poller, _))
    
      def stop(c: Cancellable) {c.cancel()}
    }
    

    The actor that reads the resource asynchronously and triggers more async reads. You could put the message dispatch on a schedule rather than call immediately if it was kinder:

    import akka.actor.{Props, Actor}
    import java.io.File
    
    class ActingSpider extends Actor {
      import context._
      def receive = {
        case name: String => {
          println("reading " + name)
          new File(name) match {
            case f if f.exists() => spider(f)
            case _ => println("File not found")
          }
          context.stop(self)
        }
      }
    
      def spider(file: File) {
        io.Source.fromFile(file).getLines().foreach(l => {
          val k = actorOf(Props[ActingSpider], name=l.filter(_.isLetterOrDigit))
          k ! l
        })
      }
    }
    
    0 讨论(0)
提交回复
热议问题