Akka异步通信《three》译

异步通信

    Actors是被动的和消息驱动的,Actors在收到消息以前不会作任何事,使用异步消息进行通讯。这确保发送方不会停留在等待其消息由接收者处理。相反,发送者将消息发送到收件人的邮箱中,并能够自由地进行其余工做。Actors的邮箱本质上是一个具备排序语义的消息队列。从同一个Actor发送的多个消息的顺序保存下来,可是能够与其余Actor发送的消息交织在一块儿。html

    您可能会想知道当Actors不是处理消息时,即在实际工做时,在作什么?它处于一个悬浮状态,它不消耗除内存以外的任何资源。再次显示出Actors的轻量级、高效的性质。微信

发送消息给Actor

    要将消息放到Actors邮箱里,使用ActorRef的“!(bang)方法”。例如,helloworld的主类将消息发送给相似于此的Greeter Actor:框架

    Greeter Actor也发消息给Printer Actor:printerActor ! Greeting(greeting)异步

    咱们已经研究了如何建立Actor和发送消息。如今,让咱们经过对主要类的总体进行回顾。ide

    helloworld中的主类建立并控制了Actors。注意使用一个ActorSystem做为容器和使用actorOf建立Actors。最后,该类发送消息给Actors。函数

   

 一样地,让咱们再看看定义Actors和接受的消息的完整源代码(详细代码)。工具

 做为另外一个最佳实践,咱们应该提供一些测试覆盖率。测试

测试Actors

  helloworld示例中的测试说明了使用Scalatest框架,测试覆盖率还不够完整。它简单地说明了测试Actor代码和提供一些基本概念是多么容易。你能够继续完整,来锻炼增长你本身的知识 。ui

 Test类的定义

 咱们开始看看AkkaQuickstartSpec.scala源文件中测试类的定义:spa

     

测试类继承了akka.test.TestKit,它是Actors和Actors系统集成测试的模块。这个类只使用了的TestKit提供的一部分功能,其余扩展类则来自于ScalaTest。它们为helloworld测试用例提供语法和功能。例如,经过扩展FlatSpecLike,咱们能够用“x应该y”格式编写测试规范,例如:

 测试方法

    既然咱们知道了一些基本概念,让咱们来看看已经实现的测试方法。

    集成测试能够帮助咱们确保参与者在异步运行。第一个测试使用TestProbe来询问并验证预期的行为。让咱们来看看源代码片断:

    一旦咱们引用了TestProbe,咱们将它传递给了Greeter做为构造函数参数的一部分,而后咱们给Greeter发送两条信息;一个设置问候人打招呼,另外一个触发问候。TestProbe上的expectMsg方法验证消息是否已发送(完整示例)。

    示例代码只会触及到的中可用的基本功能,如今咱们已经测试了全部代码。

运行示例

    您能够从命令行或IDE运行HelloWorld应用程序。可是,在咱们再次运行应用程序以前,让咱们快速查看一下构建工具:sbt。

构造文件

    sbt使用build.sbt文件来处理项目。这个项目的build.sbt文件以下所示:

    这个构建文件很是简单。从本质上说,它建立了一个项目Hel-AkkaScala,并声明了项目依赖关系。咱们还必须声明使用哪一个版本的sbt,这是在文件project/build.properties中完成的:

    正如前面所作的那样,从控制台运行应用程序:

    1./sbt -> OSX/Linux 或者 sbt.bat -> Windows

     sbt下载项目依赖项,> 提示符表示SBT已在交互模式下启动。

    2.而后咱们输入 reStart

    而后咱们能够看到如下的输出:

    

    还记得测试实现将Printer Actor设置为使用Akka记录器吗?这提供了许多额外的信息。例如,日志输出包含Actor的时间和名称。让咱们先关注Actor的输出:

    这是咱们向GreeterActor发送消息的代码的结果:

    尝试再运行几回代码,并确保注意到日志记录的顺序。你注意到了吗?顺序不是固定的,这里发生了什么?异步行为变得明显。这对你来讲多是一种新的思惟模式。可是,一旦你得到了经验,一切都会变得清晰;就像“黑客帝国”中的尼欧同样。

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

相关文章
相关标签/搜索