- 1、本文档共16页,可阅读全部内容。
- 2、有哪些信誉好的足球投注网站(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
- 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
AKKA2.0中文指南
AKKA 2.0 Scala API
4.1 Actors
Actors模型为并发和分布式系统提供了一个高层次抽象,它减轻了必须处理乐观锁和线程管理的开发,使开发支持并发和并行的系统更加容易,Actors在CarlHewitt 1973年发表的论文里定义,但其普及则是由于Erlang语言的广泛应用,其中一个很好的典型案例是爱立信公司基于此模型非常成功的构建了高并发和高可用系统。
Akka actors的API和Scala actors的API非常像,都借鉴了一些Erlang的一些语法。
4.1.1 创建Actors
自从AKKa强制父级监管,每个actor会被监管并且作为(潜在)子级的监管者;熟悉Actor系统和监管和检测是明智的并且它会可能对阅读actor相关概述也是有帮助的。
定义一个Actor类
Actor实现类需要继承Actor类并且实现receive方法。Receive方法需要定义一系列case语句(具有PartialFunction[Any,Unit])来界定你的Actor可以处理哪些消息,使用标准的Scala模式匹配,以及消息如何被处理的具体实现。
一个例子:
Import akka.actor.Actor
Import akka.actor.Props
Import akka.event.Logging
Class MyActor extends Actor{
val log = Logging(context.system, this)
def receive = {
case test = log.info(receivedtest)
case _ = log.info(receivedunknownmessage)
}
}
请注意AKKa Actor接受消息循环是详尽无任何遗漏的, 和Erlang及Scala的 Actor是不同的。意思是你需要为所有可以接受的消息提供模式匹配,并且如果你想要处理未知消息那你需要有一个默认case语句像上面的例子所示。否则一个akka.actor.UnhandledMessage(message,sender,recipient)将会被发布给ActorSystem的EventStream。
通过默认构造创建Actors
object Main extends App{
val system = ActorSystem(MySystem)
val myActor = system.actorOf(Props[MyActor],name=myactor)
actorof的调用返回一个ActorRef。这是一个Actor实例的句柄可以实现和Actor的交互。ActorRef是不可变的并且和它所代表的Actor有一对一关联,而且是可序列化和网络感知的。这意思是你可以把它序列化,通过连接发送它,并且通过网络在一个远程主机上使用它,并且它会仍然代表同一个原型节点上的Actor。
在上面的例子中actor是被系统创建的。它也可能是其它actor通过其actor context创建的actors。不同之处是监管者层级如何安排。当使用context时当前的actor将是创建的子actor的监管者。当使用system时它将是一个顶级actor,它将被系统监管(内部监管的actor)。
class FirstActor extends Actor {
val myActor = context.actorOf(Props[MyActor],name=myactor)
名称参数是可选的,但你必须尽可能命名你的actors,因为要在日志消息中作为acotr的标识。名称不能为空或$。如果名字已经被另外一个同父的子级actor使用会抛出一个InvalidActorNameException异常。
Actors在创建成功后会自动被异步启动。当你创建一个Actor之后它会自动调用Actor特质中的preStart回调方法。这是一个添加Actor初始化代码的极好的位置。
override def preStart() = {
... // initializationcode
}
使用非默认构造创建Actor
如果你的Actor有一个带参数的构造函数那么你不能使用actorOf(Props[TYPE])创建它。作为替代你可以使用一个不同的actorOf,带有一个通过名称调用的代码块,在里面你可以以你喜欢的任何方式创建Actor。
这里有一个例子:
// 允许向 MyActor 的构造函数中提交参数
val myActor = system.actorOf( Props( newMyActor( ... ) ), name=myactor )
Props
Props是一个配置参数类用于引用可以
文档评论(0)