Akka定义Actors和消息《two》译

Akka定义Actors和消息

    消息(Messages)能够是任意类型(任何Any的子类)。您能够发送装箱的原始值(例如String, Integer, Boolean等)做为消息以及诸如数组和集合类型等普通数据结构。Case类和Case对象建立更优的消息,由于它们是不可改变的,而且支持模式匹配,有利于咱们在Actor中匹配所接收到的消息。html

    Hello World Actor 使用三种不一样的 messages:api

  • WhoToGreet:接受问候语
  • Greet:执行问候语的指令
  • Greeting:包含问候语的消息

    当定义Actor及其Messages时,请记住如下建议:数组

  • 因为消息是Actor的公开api,因此定义好名称和丰富语义和特定域含义的消息是一个很好的实践,即便它们只是封装了数据类型。这将使使用、理解和调试基于Actor的系统变得更加容易。
  • 消息须要不可变的,由于他们会在不一样线程之间分享。
  • 将Actor关联的消息放在其同伴对象中是一种很好的实践。这使得actor指望了解的消息类型和处理变得更加容易。
  • 在同伴对象使用了一个props方法,也是一个常见模式描述actor的构造。

    让咱们看看的同伴对象和实现了Actor的Greeter和Printer实现如何演示这些最佳实践。安全

    Greeter Actor的同伴对象:

    下面的代码片断是在AkkaQuickstart.scala中用来给同伴对象定义mesage被Greeter对象处理,而且定义了props方法微信

    “props方法”建立并返回一个props实例。props是一个配置类,用来指定建立actors的选项,认为它是一个不可改变的、可自由共享的建立actor的方法,能够包含相关的部署信息。这个示例简单地传递了当构造时角色须要的参数。咱们将在本教程稍后看到“props方法”。数据结构

 Greeter Actor实现

下面的代码片断在AkkaQuickstart.scala,实现Greeter Actor:分布式

    让咱们分解这段功能:ide

  • Greeter继承akka.actor.Actor,实现receive方法
  • 构造函数接受两个参数:message:string,它将用于构建问候语消息和printerActor:ActorRef,它引用了处理问候语输出的行为者。
  • receive方法定义行为,Actor应该如何应对接收到的不一样消息。Actor能够有状态。访问或改变一个Actor的内部状态是彻底线程安全,由于它受到了Actor模型的保护。接收方法应该处理参与者指望的消息。在代码中的状况下,它指望两种类型的消息:WhoToGreet和Greet。前者会更新greeting Actor的问候状态,后者会触发Printer Actor的问候。
  • greeting变量包含了角色的状态,并设置为默认状况下为""。

 Printer Actor 伙伴对象

    和Greeter相似,伙伴对象定义Printer Actor要处理的消息,定义 props方法和Actor指望的消息:函数

    Printer Actor的实现:优化

    Printer的实现很是简单

  • 继承akka.actor.ActorLogging自动获取一个logger的引用,经过这样作,咱们能够在Actor中编写log.info(),而无需添加任何附加导入或链接。   
  • 它只处理一种消息、问候语和记录该消息内容。

    

    建立Actors

    到目前为止,咱们已经研究了Actor及其message的定义。如今让咱们深刻到位置透明性的力量,并看看如何建立Actor实例。

    位置透明性的力量

    在Akka中,您不能使用new关键字建立一个Actor实例。取而代之的,您可使用工厂建立Actor实例。工厂不会返回一个Actor实例,而是指向实例的引用,akka.actor.ActorRef这种间接方式在分布式系统中增长了的力量和灵活性。

    在Akka中,并不关心位置。位置透明性意味着,在保留相同语义的同时,ActorRef在能够表示进程中运行的Actor或远程机器上的实例。若是须要,运行库能够经过更改Actor位置或运行时的整个应用程序拓扑来优化系统。这使得“let it crash”的失败管理模型,系统能够经过崩溃错误的Actors和重启健康的故障管理来治愈本身。

    Akka ActorSystem

     akka.actor.ActorSystem factory 在某种程度上相似于Spring的BeanFactory。它充当Actor的容器,并管理他们的生命周期。在工厂方法建立Actor并获取两个参数,一个名为“Props”和“name”的配置对象。

    Actor和ActorSystem名字在Akka中很重要。例如,您使用它们进行查找。使用与您的域模型相一致的有意义的名称使得在道路上更容易地对它们进行理性的解释。

    上一个话题回顾了helloworld Actor的定义。让咱们来看看建立Greeter和Printer实例的AkkaQuickstart.scala文件中的代码:

   

    注意到下面这些:

  • ActorSystem在actorOf方法建立了Printer角色。正如咱们在前面的主题中讨论过的那样,它使用了Printer伙伴对象的props方法来获取props值。ActorRef提供了对新建立的Printer Actor实例的引用。
  • 对于Greeter,代码建立了三个角色实例,每一个实例都带有特定的问候消息。

    注意:在本例中,Greeter Actors实例都使用相同的Printer实例,可是咱们能够建立多个Printer Actor实例。例子中使用一个示例来讲明消息传递的一个重要概念,稍后咱们将介绍。

    接下来,让咱们来看看如何与Actors沟通。

    原文:https://developer.lightbend.com/guides/akka-quickstart-scala/create-actors.html

    有什么讨论的内容,能够加我微信公众号:

相关文章
相关标签/搜索