Akka异步通讯《three》译

异步通讯

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

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

发送消息给Actor

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

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

    我们已经研究了如何创建Actor和发送消息。现在,让我们通过对主要类的整体进行回顾。

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

   

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

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

测试Actors

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

 Test类的定义

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

     

测试类继承了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发送消息的代码的结果:

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

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

猜你喜欢

转载自blog.csdn.net/woshiyexinjie/article/details/81356864
今日推荐