package akka.scala
import 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
当你调用ActorSystem
的actorOf
方法时,将创建并返回一个ActorRef
的实例:
def actorOf(props: Props, name: String): ActorRef
。
这个引用用来处理actor,你可以将其看做是处理实际actor的代理人(broker)或包装外观(facade)。ActorRef防止你破坏Actor模型,比如直接处理Actor实例,或直接修改Actor实例中的变量。所以只能通过给actor发送消息方式来执行任务,这种“袖手旁观(不干涉,hands-off)”的方法帮助巩固适宜的编程实践。
ActorRef有以下特点:
http://blog.csdn.net/JasonDing1354/article/details/50533113
- 它是不可变的
- 它与actor实体是一对一的关系
- 它是可序列化的,网络可感知的。这使得你可以在网络环境中传送一个ActorRef