zoukankan      html  css  js  c++  java
  • 翻译:AKKA笔记

    从第一篇Akka笔记的介绍中,我们是从很高的高度去观察Akka工具箱中的Actors。在这篇笔记的第二篇,我们会看一下Actors中的消息部分。而且延续上一次的例子,我们还会使用同样的学生与老师的例子。

    在Actor消息的第一部分,我们会建立一个Teacher Actor,而且会使用一个叫StudentSimulatorApp的主程序。

    回顾学生-老师模式的细节##

    现在考虑下StudentSimulatorApp单独发消息给TeacherActor。当我说到StudentSimulatorApp,就只是意思是一个常规的带main函数的主程序。

    这张图传递的意思是:
    (如果太复杂,别担心,我们会详细过一遍)
    1.学生创建了一个叫ActorSystem的东西
    2.它用ActorSystem来创建一个叫ActorRef的东西。QuoteRequest消息被发送到ActorRef(一个TeacherActor的代理)
    3.Actor ref同样把消息发给Dispatcher
    4.Dispatcher将消息放入到目标Actor的邮箱中(MailBox
    5.Dispatcher将Mail放到一个线程中(下节详细介绍)
    6.MailBox取出一个消息并且最后将消息送给实际的Teacher Actor的接收方法。

    就像我说的,别担心。下面我们看看每一步的细节。你可以在后面重新回来看下这五步。

    STUDENTSIMULATORAPP程序##

    我们用StudentSimulatorApp启动JVM并且初始化ActorSystem。

    就像图片上画的,这个StudentSimulatorApp
    1.创建了一个ActorSystem
    2.使用ActorSustem创建了一个Teacher Actor的代理(ActorRef)
    3.给代理发送QuoteRequest(请求格言)消息。

    让我们一起看下这三点。

    1.创建 一个ActorSystem###

    ActorSystem是一个进入Actor世界的入口点。ActorSystem在创建和停止Actors的时候自始至终都存在着。并且在关掉整个Actor环境的时候也存在着。

    在另一个方面,Actors是按层级划分的,ActorSystem可以类比为对于所有Actor的java.lang.Object基类对象或者scala.Any- 意思是它是所有Actors的根对象。当你用ActorSystem的actorof方法创建了一个Actor对象,你实际上创建了一个ActorSystem下一个一个子Actor。

    初始化ActorSystem的代码类似于这个样子

    val system=ActorSystem("UniversityMessageSystem")

    这里的UniversityMessageSystem就是一个你给ActorSystem的昵称。

    2.创建一个TeacherActor的代理?###

    让我们看下下面的片段:

    'val teacherActorRef:ActorRef=actorSystem.actorOf(props[TeacherActor])'

    actorOf是ActorSystem中的Actor的创建方法。但是,你可以看见这个方法并不返回一个TeacherActor。它返回一个类型是ActorRef的东西。

    ActorRef是一个真实Actors的代理。客户端并不直接跟Actor对话。这这种Actor的模型是为了防止TeacherActor的自定义/私有方法或变量被直接访问。

    你只会直接给ActorRef发送消息并且消息最终会到达实际的Actor。你永远不能直接跟Actor交互。要是你找到一些方式干这个,你会被大家诅咒。

    3.给代理发送一个QuoteRequest###

    你只需要将QuoteRequest消息tell告诉ActorRef。这个告诉的方法在Actor里面是叹号。(ActorRef也有一个tell方法,作用是委托回调给

    '//send a message to the Teacher Actor'
    'teacherActorRef!QuoteRequest'

    这就没了!

    如果你觉得我骗你,下面是StudentSimulatorApp的代码:

    STUDENTSIMULATORAPP.SCALA###

    package me.rerun.akkanotes.messaging.actormsg1
    
    import akka.actor.ActorSystem  
    import akka.actor.Props  
    import akka.actor.actorRef2Scala  
    import me.rerun.akkanotes.messaging.protocols.TeacherProtocol._
    
    
    object StudentSimulatorApp extends App{
    
      //Initialize the ActorSystem
      val actorSystem=ActorSystem("UniversityMessageSystem")
    
      //construct the Teacher Actor Ref
      val teacherActorRef=actorSystem.actorOf(Props[TeacherActor])
    
      //send a message to the Teacher Actor
      teacherActorRef!QuoteRequest
    
      //Let's wait for a couple of seconds before we shut down the system
      Thread.sleep (2000) 
    
      //Shut down the ActorSystem.
      actorSystem.shutdown()
    
    } 
    

    不过,我确实撒了一个小慌。你需要shutdown ActorSystem或者让JVM一直跑。我给这个main线程sleep一下只是为了给TeacherActor一点时间来完成它的任务。我知道这听起来有点傻。别担心这个。我们后面会写一些测试用例来避免这个。

    这是我翻译的文章,原文在http://rerun.me/2014/09/19/akka-notes-actor-messaging-1/


    文章来自微信平台「麦芽面包」,微信号「darkjune_think」。转载请注明。

  • 相关阅读:
    阿里Canal中间件的初步搭建和使用
    十大经典排序算法动画与解析,看我就够了!(配代码完全版)
    单点登录系统简介
    业务系统日志追踪
    kafka单机环境搭建及其基本使用
    Kafka 错误信息 java.io.IOException: Can't resolve address: VM_0_15_centos:9092
    CAS(乐观锁)以及ABA问题
    kafka_2.11-0.10.1.1集群搭建安装配置
    contos7 mongodb安装教程
    mongodb基础操作
  • 原文地址:https://www.cnblogs.com/zhukunrong/p/4735330.html
Copyright © 2011-2022 走看看