第92讲:Akka第一个案例动手实战开发环境的搭建,第93讲:Akka第一个案例动手实战开发消息实体类学习笔记

92讲:Akka第一个案例动手实战开发环境的搭建学习笔记

 

本讲主要讲解如何利用IDEA创建项目。

开发akka最好用IDEA

1.IDEA自动集成了插件,

2.IDEA越用越智能

 

 

1)创建maven工程

2pom.xml配置

 

93讲:Akka第一个案例动手实战开发消息实体类学习笔记

 

mapActor的重要功能就是把收到的消息进行单词切分。

ReduceActor是对mapActor的结果进行统计

AggregateActor是对最后 所有的ReduceActor的进行统计

MasterActor是控制器,给mapActor发具体字符串,要求MapActor进行单词切分等工作。

 

actor间存在消息传输,用什么表达消息呢?

数据存储是以什么样的方式存储及传递呢?

 

java中定义的数据的实体是javabeen

 

//actors: MapActor,ReduceActor,AggregateActor,MasterActor

 

package akka.dt.app.java.messages;

public class MapActor{

  String[] STOP_WORDS = {"a","is"};

  oruvate Kust<String> STOP_WORDS_LIST - Array.asList(STOP_WORDS);

  public MapActor(ActorRef inReduceActor) {reduceActor = inReduceActor;}

  @Override

  public void onReceive(Object message) throws Exception{

    if (message instanceof String) {

      String work = (String) message;

      //map the words in the sentence

      MapData data = evaluateExpression(work);  //产生MapData实体

      //send the result to ReduceActor

      reduceActor.tell(data);

    } else

      unhandled(message);

  }

 

  private MapData evaluateExpression(String line){

    List<WordCount> dataList = new ArrayList<!>();

    StringTokenizer parser = new StringTokenizer(line);

    while(parser.hasMoreTokens()) {

      String word = parser.nextToken().toLowerCase();

      if(!STOP_WORDS_LIST.contains(word)){

        dataList.add(new WordCount(word, Integer.valueof(1)));

      }

    }

    return new MapData(dataList);

  }

}

 

public class ReduceActor extends UntypeActor {

  private ActorRef aggregateActor = null;

  public ReduceActor(ActorRef inAggregateActor) {aggregateActor = inAggregateActor;}

  @Override

  public void onReceive(Object message) throws Exception{

  //AggregateActor收到的消息有两种,一种是ReduceData类型,一种是Result类型

    if (message instanceof MapData) {

      MapData mapData = (MapData) message;

      //reduce the incoming data

      ReduceData reduceData = reduce(mapData.gerDataList());

      //forward the result to aggregate actor

      aggregateActor.tell(reduceData);

    } else

      unhandled(message);

  }

  private ReduceData reduce(List<WordCount> dataList){

    HashMap<String, Integer> reducedMap = new HashMap<~>();

    for (WordCount wordCount : dataList){

      if(reduceMap.containsKey(wordCount.getWord())){

        Integer value = (Integer) reducedMap.get(wordCount.getWord());

        value++;

        rduceMap.put(wordCount.getWord(),value);

      } else {

        reduceMap.put(wordCount.getWord(),Integer.valueOf(1));

      }

    }

    return new ReduceData(reducedMap);

  }

}

 

package akka.dt.app.java.actors;

import ...

public class AggregateActor extends UntypeActor {

  private Map<String,Integer> finalReducedMap = new HashMap<~>();

  @Override

  public void onReceive(Object message) throws Exception{

  //AggregateActor收到的消息有两种,一种是ReduceData类型,一种是Result类型

    if (message instanceof ReduceData) {

      ReduceData reduceData = (ReduceData) message;

      aggregateInMemoryReduce(reduceData.getReduceDataList());

    } else if (message instanceof Result) {

      System.out.prontln(finalReducedMap.toString());

    } else

      unhandled(message);

  }

 

  private void aggreInMemoryReduce(Map<String,Integer> reducedList){

    Integer count = nul;

    for (String key : reducedList.keySet()) {

      if (finalReduceMap.containsKey(key)){

        count - reducedList.get(key) + finalReducedMap.get(key);

        finalReducedMap.put(key, count);

      } else {

        finalReducedMap.put(key,reducedList.get(ley));

      }

    }

  }

}

 

 

 

public class MasterActor extends UntypedActor {

  private ActorRef aggregaterActor = getContext().actorOf(

    new Props(AggregateActor.class), "aggregate");

  private ActorRef reduceActor - getContext().actorOf(

    new Props((UntypeActorFactory create() → {return new ReduceActor(aggregateActor);}),"map")

  @override

  public void onReceive(Object message) throws Exception{

    if (message instanceof String) {

      mapActor.tell(message);

    } else if (message instanceof Result) {

      aggregateActor.tell(message);

    } else

      unhandled(message);

  }

}

 

 

//messages:MapData,ReduceData,Result,WordCount

 

package akka.dt.app.java.messages;

import java.util.List;

public class MapData {    //用来让MapActor处理数据后存储在MapData实体中,

//然后方便把处理结果交给ReduceActor

  private List<WordCount> dataList;    //私有成员是List,具体类型是WordCount,WordCount也是javabeen

  public List<WordCount> getDataList() {return dataList;}

  public MapData(List<WordCount> dataList) {this.dataList = dataList;}

}

 

package akka.dt.app.java.messages;

import java.util.HashMap;

public class ReduceData {

  private HashMap<String, Integer> reduceDataList;

  public HashMap<String, Integer> getReduceDataList(){return reduceDataList;}

  public ReduceData(HashMap<String, Integer> reduceDataList){this.reduceDataList = reduceDataList;}

}

//ReduceData进行本地型统计

 

 

package akka.dt.app.java.messages;

public class Result {

}

//传入的字符串先交给MapActor进行切分,然后交给ReduceActor进行本地统计,

//最后交给AggregateActor进行全局的统计,

//想要获得这个结果,通过MasterActor发一个消息ResultResult本身为空,不需要有任何内容。

//这个消息交给MasterActorMasterActor收到消息时,如果消息是result类型的话转过来会告诉AggregateActor,

//再转发给AggregateActor

 

WordCount是纯粹的javabeen

package akka.dt.app.java.messages;

public class WordCount {

  private String word;

  private Integer count;

  public WordCount(String inWord, Integer inCount){

    word = inWord;

    count = inCount;

  }

  public String getWord(){return word;}

  public Integer getCount(){return count;}

}

 

public class HelloAkka {

  public static void main(String[] args) throws Exception {

    ActorSystem _system =  ActorSystem.create("HelloAkka");

    ActorRef master = _system.actorOf(new Props(MasterActor.class),"master");

    master.tell("Hi! My name is Rocky. I'm so so so so happy to ne here. ");

    master.tell("Today, I'm going to read a news article for you. ");

    master.tell("I hope I hope you'll like it.")

 

    Thread.sleep(500);

    master.tell(new Result());

    Thread.sleep(500);

    _system.shutdown();

  }

}

本讲主要讲解不同Actor间如何协同工作,如何传数据。

 

 

以上内容是从王家林老师DT大数据课程第92讲和第93的学习笔记。
DT大数据微信公众账号:DT_Spark  

王家林老师QQ:1740415547 

王家林老师微信号:18610086859

今日【DT大数据梦工厂视频】《第92讲:Akka第一个案例动手实战开发环境的搭建》
56视频:http://www.56.com/u84/v_MTM4Njg1MTY5.html 

土豆视频:http://www.tudou.com/programs/view/Te7ACPZRYQY/ 

(DT大数据梦工厂1至93讲scala的所有视频、PPT和代码在百度云盘的链接:http://url.cn/fSFPjS)

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
### 回答1: 在 Akka 中,每个 actor 都有一个邮箱,用于接收和存储消息。你可以将 Akka 的邮箱比作真实世界中的邮箱:每个人都有自己的邮箱,当有人给你写信时,就会把信放到你的邮箱里。 下面是一个使用 Akka 的邮箱的简单案例: 首先,我们需要创建一个 actor 类型,用于接收和处理消息。在这个例子中,我们创建了一个名为 `MyActor` 的 actor,它接收字符串消息并将其打印到控制台。 ```scala import akka.actor.Actor class MyActor extends Actor { def receive = { case s: String => println(s) } } ``` 接下来,我们需要创建一个 actor 系统,用于管理 actor。在这个例子中,我们创建了一个名为 `MyActorSystem` 的 actor 系统,并在其中创建了一个名为 `myActor` 的 `MyActor` 实例。 ```scala import akka.actor.ActorSystem val system = ActorSystem("MyActorSystem") val myActor = system.actorOf(Props[MyActor], name = "myActor") ``` 最后,我们可以向 `myActor` 发送消息。这些消息将被存储在 `myActor` 的邮箱中,并在 `myActor` 处理它们时被处理。 ```scala myActor ! "Hello, World!" myActor ! "Hello again!" ``` 这就是使用 Akka 的邮箱的简单案例。通过使用 actor 和 actor 系统 ### 回答2: Akka是一个用于构建可扩展的并发应用程序的开源工具包。在Akka中,信箱是一个重要的概念,它被用来传递和接收消息。 下面是一个简单的Akka邮箱案例: 假设我们有一个名为Email的类,它包含了发送和接收邮件所需要的信息,例如发件人、收件人和邮件内容。我们希望使用Akka实现一个简单的邮件系统,其中包含一个邮箱Actor和多个客户端Actor。 首先,我们创建一个名为Mailbox的Actor。该Actor负责接收邮件,并将其存储在一个邮箱中。它还可以提供一些方法,例如获取最新的邮件、删除已读邮件等。Mailbox Actor可以使用Akka的mailbox模块来处理消息队列。 然后,我们创建多个客户端Actor,每个客户端Actor代表一个用户。当一个客户端Actor想要发送一封邮件时,它会将邮件消息发送给Mailbox Actor。Mailbox Actor会将邮件存储在邮箱中,并返回一个表示邮件发送成功的响应消息给客户端Actor。 客户端Actor可以使用Mailbox Actor提供的方法来获取未读邮件、删除已读邮件、标记已读邮件等。当客户端Actor获取到邮件时,它可以执行一些操作,例如显示邮件内容或者将邮件保存到本地。 整个系统的工作流程如下: 1. 创建Mailbox Actor,并启动它。 2. 创建多个客户端Actor,并启动它们。 3. 客户端Actor发送一封邮件给Mailbox Actor。 4. Mailbox Actor将邮件存储在邮箱中,并返回发送成功的响应消息给客户端Actor。 5. 客户端Actor可以使用Mailbox Actor提供的方法来获取未读邮件、删除已读邮件等。 6. 客户端Actor执行相应的操作,例如显示邮件内容或者保存邮件到本地。 这是一个非常简单的Akka邮箱案例。通过这个案例,我们可以了解到Akka中如何使用Actor和消息传递来实现一个简单的邮箱系统。当然,在实际应用中,可能会有更多的功能和复杂性。 ### 回答3: Akka是一种用于构建并发、分布式、可容错应用程序的开源工具包。在Akka中,有一个重要的概念是Actor,它是一个轻量级的执行单元,可以并发地执行任务并与其他Actor进行通信。 在一个使用Akka的邮箱案例中,我们可以模拟一个简单的邮箱系统。这个邮箱系统有多个角色,包括发送邮件的人、接收邮件的人和邮箱服务器。每个角色都是一个Actor,并且彼此之间通过消息进行通信。 首先,我们创建一个名为"EmailSender"的Actor,用于发送邮件。每个发送者Actor都有一个接收邮件者Actor的引用,并可以向接收者发送邮件。 其次,我们创建一个名为"EmailReceiver"的Actor,用于接收邮件。每个接收者Actor都有一个邮箱,可以接收来自发送者的邮件。 最后,我们创建一个名为"EmailServer"的Actor,用于处理发送者和接收者之间的通信。当发送者发送邮件时,它将把邮件发送给服务器Actor,并由服务器Actor将邮件传递给接收者Actor。 在这个案例中,我们可以使用Akka提供的Actor模型来实现并发和消息传递。我们可以在邮件发送者Actor中定义发送邮件的行为,包括选择接收者Actor并发送邮件。接收者Actor中的行为可能包括接收和存储邮件。服务器Actor可以协调发送者和接收者之间的消息传递。 这个简单的邮箱案例只是Akka的一个应用示例,它展示了Akka的基本概念和用法。在实际应用中,我们可以根据需求进行更复杂的设计和实现。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值