Akka初体验之scala版word-count 的实现

参考

《scala 深入浅出实战》 王家林

场景

akka 入门之用akka实现一个word计数程序

环境

架构

实验

这里只列出关键类的源码,整个项目的源代码参见:https://github.com/pengyucheng相关目录

MapReduceApplication源码

package akka.dt.app.scala.messages

import akka.actor.{ActorSystem, Props}
import akka.dt.app.scala.actors.MasterActor

/**
  * Created by pengyucheng on 16-4-12.
  */
object MapReduceApplication {

  def main(args: Array[String]) {
    val _system = ActorSystem("HelloAkka")
    val master = _system.actorOf(Props[MasterActor],name = "master")

    println(master.path)

    master ! "Hi, this is ivy , more information at pengych cool"
    master ! "you are my sunshine my only sunshine ,please do remember what you want from me !"
    master ! "one life , more more at pengych live it !"

    Thread.sleep(5000)
    master ! new Result

    Thread.sleep(5000)
    _system.terminate()
  }
}

MasterActor源码

package akka.dt.app.scala.actors

import akka.actor.{Actor, ActorRef, Props}
import akka.dt.app.scala.messages.Result

/**
  * Created by pengyucheng on 16-4-12.
  */
class MasterActor extends Actor{

  val aggregateActor:ActorRef = context.actorOf(Props[AggregateActor],name = "aggregate")
  val reduceActor:ActorRef = context.actorOf(Props(new ReduceActor(aggregateActor)),name = "reduce")
  val mapActor:ActorRef = context.actorOf(Props(new MapActor(reduceActor)),name = "map")

  def receive:Receive = {
    case message:String => mapActor ! message
    case message:Result => aggregateActor ! message
    case _ =>
  }
}
AggregateActor源码

package akka.dt.app.scala.actors

import akka.actor.Actor
import akka.dt.app.scala.messages.{ReduceData, Result}
import scala.collection.JavaConversions._

/**
  * Created by pengyucheng on 16-4-12.
  */
class AggregateActor extends Actor {

  var finalReducedMap = new java.util.HashMap[String,Integer]

  def  receive:Receive = {
    case message:ReduceData => aggregateInMemoryReduce(message.reduceData)
    case message:Result =>
      System.out.println(finalReducedMap.toString)
  }

  def aggregateInMemoryReduce(reducedList:java.util.HashMap[String,Integer]) = {
    var count:Integer = 0
    for (key <- reducedList.keySet()){
      if(finalReducedMap.containsKey(key)){
        count = reducedList.get(key)
        count += finalReducedMap.get(key)
        finalReducedMap.put(key,count)
      } else {
        finalReducedMap.put(key,reducedList.get(key))
      }
    }
  }
}

运行结果

akka://HelloAkka/user/master
{,please=1, sunshine=2, hi,=1, do=1, life=1, remember=1, are=1, only=1, me=1, from=1, you=2, live=1, !=2, pengych=2, more=3, cool=1, want=1, one=1, this=1, it=1, ,=2, my=2, ivy=1, at=2, what=1, information=1}

Process finished with exit code 0

源码 ( 待补充)

一、word-count源码分析

二、akka 源码分析


你可能感兴趣的:(Akka初体验之scala版word-count 的实现)