Akka学习 实现workcount
发表于:2026-11-01 作者:千家信息网编辑
千家信息网最后更新 2026年11月01日,package com.dcx.scala.actorimport akka.actor.{Actor, ActorRef, ActorSystem, Props}import scala.colle
千家信息网最后更新 2026年11月01日Akka学习 实现workcount
package com.dcx.scala.actorimport akka.actor.{Actor, ActorRef, ActorSystem, Props}import scala.collection.mutable.HashMapimport scala.collection.mutable.ListBufferimport scala.io.Source/** * 思路: * 要有个Server * 要有个Client去通信,client统计文本后把(qy,3)输出给Server;Server再把所有的qy聚合,放到ListBuffer中 */object AkkaWordCount {// 可变长List val list = new ListBuffer[HashMap[String,Int]] def main(args: Array[String]): Unit = {// 输入数据文本 val files: Array[String] = Array("D:\\tmp\\input\\word3.txt", "D:\\tmp\\input\\word3.txt", "D:\\tmp\\input\\word3.txt") //存放接收到的每个actor处理的结果数据 //存放有actor返回结果的Future数据 //拿ActorSystem是一个静态工厂 val weChatApp = ActorSystem("WeChatApp") //拿到两个Actor的通信地址 val akkaServerRef: ActorRef = weChatApp.actorOf(Props[AkkaServer],"jianjian1") val clientRef: ActorRef = weChatApp.actorOf(Props(new Client(akkaServerRef)),"jianjian") for (file <- files) { clientRef ! file }// 让该线程先睡一下,过早进入死循环会导致list没有3个,一直循环不出来 Thread.sleep(1000)// 如果list把三个文件都放满了,就退出循环 while(true){ if(list.size == 3){// 输出list println(list(list.size -1)) return } } }}//把每次聚合后的值都发送给AkkaServerclass Client(val serverRef:ActorRef) extends Actor { override def receive: Receive = { {// 偏函数 常用作模式匹配// case filePath: String => {//// map阶段// val list: List[String] = Source.fromFile(filePath).getLines().toList// val words: List[String] = list.flatMap(_.split(" "))// val res: Map[String, Int] = words.map((_, 1)).groupBy(_._1).mapValues(_.size)// //异步发送结果数据 res发送到Server,去模式匹配// serverRef ! res// } case filePath:String => { val list: List[String] = Source.fromFile(filePath).getLines().toList val words: List[String] = list.flatMap(_.split(" "))// 得出: (qy,3) 格式 val res: Map[String, Int] = words.map((_, 1)).groupBy(_._1).mapValues(_.size) serverRef ! res } } }}import scala.collection.mutable.HashMapclass AkkaServer extends Actor { private var hashMap: HashMap[String, Int] = new HashMap[String, Int] override def receive: Receive = { case context: Map[String, Int] =>{// (qy,3) context.map( (map:(String,Int)) => {// 聚合 val value: Any = hashMap.getOrElse(map._1,None) if(value != None){ hashMap(map._1) = value.asInstanceOf[Int] + map._2 }else{ hashMap(map._1) = map._2 } } ) AkkaWordCount.list += hashMap } }}
数据
结果
文本
通信
两个
地址
工厂
思路
格式
模式
通信地址
阶段
静态
可变
处理
统计
输入
输出
学习
数据库的安全要保护哪些东西
数据库安全各自的含义是什么
生产安全数据库录入
数据库的安全性及管理
数据库安全策略包含哪些
海淀数据库安全审计系统
建立农村房屋安全信息数据库
易用的数据库客户端支持安全管理
连接数据库失败ssl安全错误
数据库的锁怎样保障安全
互联网高科技
互联网核心科技是什么
互联网扶贫科技
易互联网科技有限公司
互联网 科技创业
云电互联网科技
腾讯科技 互联网女皇
碳银互联网科技有限公司
广西互联网科技公司
互联网金融科技委员会
科技伦理 互联网公司
哈尔滨新华互联网科技
科技与互联网的利与弊
千方科技属于互联网企业吗
东莞新华互联网科技学校
卓翼科技产业互联网合作
黑科技 体验场景 互联网大会
湖北辰鑫科技互联网
银川新华互联网科技学校原画
互联网对科技影响
科技和互联网公司
科技与互联网
互联网科技网站
佰商互联网科技有限公司
安控科技rtu产品工业互联网
北京三清互联网科技
茂名市互联网科技产业园
崇明区互联网教育科技诚信经营
安徽零酒互联网科技有限公司
保山浩联互联网科技有限公司