用akka替换部分代码库

时间:2015-04-10 15:51:51

标签: scala akka

我有一个下载指定网页的功能:

  def getContent(link: String) = {
      scala.io.Source.fromURL(link).mkString
  }

从单线程应用程序中调用getContent。我打算用Akka实现替换getContent函数:

这就是我正在采用以下方式取代getContent:

import akka.actor.ActorSystem
import akka.actor.Actor
import akka.actor.Actor._
import akka.actor.Props
import akka.contrib.throttle._
import java.util.concurrent.TimeUnit._
import scala.concurrent.duration.{ Duration, FiniteDuration }

class HTTPAkkaActorSystem extends Actor {

  override def preStart(): Unit = {

    val greeter = context.actorOf(Props(new ContentReceiver), "greeter")

    greeter ! ContentReceiver.URLMessage("test")

  }

  def receive = {
    case ContentReceiver.URLContent(content) => println("content is " + content);
  }

  object ContentReceiver {

    case class URLMessage(url: String)
    case class URLContent(content: String)

  }

  class ContentReceiver extends Actor {

    def receive = {
      case ContentReceiver.URLMessage(url) => {
        println("accessing and returning content");
        sender ! ContentReceiver.URLContent("this is the content")
      }

    }
  }

}

object GetContentDriver {

  def main(args: Array[String]) {
    val system = ActorSystem("HTTPAkkaActorSystem")
    val ac = system.actorOf(Props[HTTPAkkaActorSystem])
  }

}

所以我打算将scala.io.Source.fromURL(link).mkString插入receive的{​​{1}}。我发现的问题是,由于Actor ContentReceiver作为主要线程的一部分运行而未使用Akka,因此如何将getContent receive的内容返回到Actor ContentReceiver }? getContent用于应用程序的其他部分,因此无法重写。我尝试这种方法的原因是getContent是一个潜在的瓶颈,因为它正在通过网络,所以akka似乎很适合这个。我能想到的另一个选择是将actor创建的内容添加到可以从应用程序的任何位置访问的队列中。

0 个答案:

没有答案