我有一个下载指定网页的功能:
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创建的内容添加到可以从应用程序的任何位置访问的队列中。