Akka初学1

来源:互联网 发布:java 安卓开发 编辑:程序博客网 时间:2024/06/05 16:49
package akka.scalaimport akka.actor.{Actor, ActorSystem, Props}/**  * 定义 AkkaTest1 Actor  * Created by liuwei on 2017/5/11.  */class AkkaTest1 extends Actor {  /**    * receive方法定义实现,其中使用了模式匹配表达式    * 接收字符串Hello作为消息,做出相应打印动作    * @return    */  override def receive: Receive = {    case "Hello" => println("world")    case _ => println("no world")  }}/**  * 测试actor  */object Test1_AkkaTest1 extends App {  //初始化一个actor系统  //ActorSystem接收一个name参数,并且通过system.actorOf创建actor实例  val system = ActorSystem("Test1_AkkaTest1")  //初始化一个actor,Actor创建后自动运行  val helloWorldActor = system.actorOf(Props[AkkaTest1], name = "helloWorld")  //通过!方法来发送消息  helloWorldActor ! "Hello"  helloWorldActor ! "liuwei"  helloWorldActor ! "Hello liuwei"  // g关闭系统  system.terminate()}


Actor模型

Actor实例可以想象成是服务器上的Web服务,你无法控制,只能通过发送消息去请求执行任务或查询信息,而不能直接在Web服务中修改状态或者处理资源。通过发送不可改变的消息,虽然看上去有些限制,但是可以很简单安全的编写并发程序。

Actor系统的形象理解

一个actor是基于Actor系统的最小单元,就像面向对象系统中的对象实例一样,它也封装了状态和行为。我们无法窥探actor内部的信息,只能通过发送消息来请求状态信息(就像是问一个人,他感觉如何)。actor中有一个存放不可变状态信息的信箱。我们通过发送信息和actor进行通信,当actor收到信息之后,它会运用相关算法来处理具体的信息。 
在一个应用程序中,多个actor构成了一套层级系统,像是一个家族或者一个商业组织。一个actor可以认为是一个商业组织的个人。一个actor有一个父亲,称为监督者(supervisor),还有好多孩子,可以认为,在一个商业组织中,主席(actor)下面有多个副主席,副主席也有很多下属随从。 
Actor系统的最佳实践是“委派任务”,尤其是当actor的行为被阻塞的时候。可以想象,在实际商业活动中,主席将要做的工作分配给下面的几个副主席去分别执行,而副主席也会将子任务分配给自己的随从,直到该任务被下属们执行完毕。

处理故障

Actor模型的一个重要内容是处理故障。在工作工程中,如果出现错误或者抛出异常,actor和其子actor都将暂停,然后发送一条信息给监督者(supervisor)actor,报告出现故障的信号。 
根据工作任务和故障的性质,监督者actor将会作出几种选择:

  • 恢复下属actor,保留内部状态
  • 重启下属actor,清空状态
  • 终止下属actor
  • 上报故障

ActorSystem

一个actor system是actors的层级集团,分享公共配置信息(比如分发器dispatchers,部署deployments,远程功能remote capabilities,地址addresses)。它同时也是创建和查询actors的入口。ActorSystem是为你的应用程序分配线程资源的结构。

ActorRef

当你调用ActorSystemactorOf方法时,将创建并返回一个ActorRef的实例: 
def actorOf(props: Props, name: String): ActorRef

这个引用用来处理actor,你可以将其看做是处理实际actor的代理人(broker)或包装外观(facade)。ActorRef防止你破坏Actor模型,比如直接处理Actor实例,或直接修改Actor实例中的变量。所以只能通过给actor发送消息方式来执行任务,这种“袖手旁观(不干涉,hands-off)”的方法帮助巩固适宜的编程实践。

ActorRef有以下特点:

  • 它是不可变的
  • 它与actor实体是一对一的关系
  • 它是可序列化的,网络可感知的。这使得你可以在网络环境中传送一个ActorRef
http://blog.csdn.net/JasonDing1354/article/details/50533113


1 0