diff --git a/scala/build.sbt b/scala/build.sbt index 70223cb..f1ff65a 100644 --- a/scala/build.sbt +++ b/scala/build.sbt @@ -6,3 +6,4 @@ scalaVersion := "2.13.1" libraryDependencies += "org.scalactic" %% "scalactic" % "3.0.8" libraryDependencies += "org.scalatest" %% "scalatest" % "3.0.8" % "test" +libraryDependencies += "com.typesafe.akka" %% "akka-actor" % "2.6.0" \ No newline at end of file diff --git a/scala/src/main/scala/day3/ActOne.scala b/scala/src/main/scala/day3/ActOne.scala new file mode 100644 index 0000000..3020a0e --- /dev/null +++ b/scala/src/main/scala/day3/ActOne.scala @@ -0,0 +1,19 @@ +package day3 +import akka.actor.Actor; +import akka.actor.ActorSystem; +import akka.actor.Props + +class HelloActor extends Actor { + def receive: Actor.Receive = { + case "hello" => println("Hi") + case _ => println("Wut") + } +} + +object ActOne extends App { + val system = ActorSystem("ActOne") + val act = system.actorOf(Props[HelloActor], name = "alice") + act ! "hello" + act ! "one" + +} \ No newline at end of file diff --git a/scala/src/main/scala/day3/LoadPages.scala b/scala/src/main/scala/day3/LoadPages.scala new file mode 100644 index 0000000..c9139d7 --- /dev/null +++ b/scala/src/main/scala/day3/LoadPages.scala @@ -0,0 +1,63 @@ +package day3 +import akka.actor.Actor; +import akka.pattern.ask; +import akka.actor.ActorSystem; +import akka.actor.Props +import akka.util.Timeout; +import scala.io.Source +import scala.concurrent.duration._; +import scala.concurrent.{Await, ExecutionContext, Future} + + +case class Get(url : String) + +object Fetch { + def getPageSize(url: String) = Source.fromURL(url).mkString.length() +} + +class PageLoader extends Actor { + + def receive: Actor.Receive = { + case Get(url) => sender ! Fetch.getPageSize(url) + } +} + +object LoadPages extends App { + val system = ActorSystem("ActOne") + val urls = List( + "http://www.amazon.com", + "http://jxs.me", + "http://www.example.com", + "http://sdf.org" + ) + + + def timeMethod(method: () => Unit) = { + val start = System.nanoTime + method() + val end = System.nanoTime + println("Method took " + (end - start) / 1000000000.0 + " seconds.") + } + + def getPageSizeSequentially() = { + for (url <- urls) { + println("Size for " + url + ": " + Fetch.getPageSize(url)) + } + } + + def getPageSizeConcurrently() = { + implicit val timeout = Timeout(5.seconds) + val futures = urls.map(url => { + val act = system.actorOf(Props[PageLoader], name = url.replace("/", "")) + act ? Get(url) + }) + for (future <- futures) { + val result = Await.result(future, timeout.duration) + println(result) + } + } + + timeMethod { getPageSizeSequentially } + timeMethod { getPageSizeConcurrently } + +}