文章目录
Akka学习笔记系列文章:
《Akka学习笔记:ACTORS介绍》
《Akka学习笔记:Actor消息传递(1)》
《Akka学习笔记:Actor消息传递(2)》
《Akka学习笔记:日志》
《Akka学习笔记:测试Actors》
《Akka学习笔记:Actor消息处理-请求和响应(1) 》
《Akka学习笔记:Actor消息处理-请求和响应(2) 》
《Akka学习笔记:ActorSystem(配置)》
《Akka学习笔记:ActorSystem(调度)》
《Akka学习笔记:ACTORS介绍》
《Akka学习笔记:Actor消息传递(1)》
《Akka学习笔记:Actor消息传递(2)》
《Akka学习笔记:日志》
《Akka学习笔记:测试Actors》
《Akka学习笔记:Actor消息处理-请求和响应(1) 》
《Akka学习笔记:Actor消息处理-请求和响应(2) 》
《Akka学习笔记:ActorSystem(配置)》
《Akka学习笔记:ActorSystem(调度)》
接《Akka学习笔记:Actor消息处理-请求和响应(1)》
二、StudentActor对InitSignal消息作出反应,并且发送了QuoteRequest 消息给TeacherActor
四、StudentActor仅仅将QuoteResponse 作为日志打印到控制台/logger
为什么我将二、四结合起来写?因为这两个很简单,如果我将他们分开来写,你肯定会讨厌我的!
第二块 - StudentActor接收来自DriverApp的InitSignal 消息,然后给TeacherActor发送一个QuoteRequest。
def receive = { case InitSignal=> { teacherActorRef!QuoteRequest } ... ...
这就是第二步要做的!
第四块,StudentActor将从TeacherActor接收到的消息记到日志里面
代码如下:
case QuoteResponse(quoteString) => { log.info ("Received QuoteResponse from Teacher") log.info(s"Printing from Student Actor $quoteString") }
我同意你认为上面的代码看起来有点想伪代码。所以,StudentActor 的完整代码如下:
package me.rerun.akkanotes.messaging.requestresponse import akka.actor.Actor import akka.actor.ActorLogging import me.rerun.akkanotes.messaging.protocols.TeacherProtocol._ import me.rerun.akkanotes.messaging.protocols.StudentProtocol._ import akka.actor.Props import akka.actor.ActorRef class StudentActor (teacherActorRef:ActorRef) extends Actor with ActorLogging { def receive = { case InitSignal=> { teacherActorRef!QuoteRequest } case QuoteResponse(quoteString) => { log.info ("Received QuoteResponse from Teacher") log.info(s"Printing from Student Actor $quoteString") } } }
三、TeacherActor用QuoteResponse作出了响应
TeacherActor接收到了QuoteRequest消息,并且用QuoteResponse 作为响应
package me.rerun.akkanotes.messaging.requestresponse import scala.util.Random import akka.actor.Actor import akka.actor.ActorLogging import akka.actor.actorRef2Scala import me.rerun.akkanotes.messaging.protocols.TeacherProtocol._ class TeacherActor extends Actor with ActorLogging { val quotes = List( "Moderation is for cowards", "Anything worth doing is worth overdoing", "The trouble is you think you have time", "You never gonna know if you never even try") def receive = { case QuoteRequest => { import util.Random //Get a random Quote from the list and construct a response val quoteResponse = QuoteResponse(quotes(Random.nextInt(quotes.size))) //respond back to the Student who is the original sender of QuoteRequest sender ! quoteResponse } } }
测试用例
现在,我们的测试用例将模拟DriverApp。然而StudentActor仅仅是把消息记录下来,它不会在QuoteResponse 进行检查。我们仅仅在EventStream 查看这些日志。我们的测试用例看起来如下:
"A student" must { "log a QuoteResponse eventually when an InitSignal is sent to it" in { import me.rerun.akkanotes.messaging.protocols.StudentProtocol._ val teacherRef = system.actorOf(Props[TeacherActor], "teacherActor") val studentRef = system.actorOf(Props(new StudentActor(teacherRef)), "studentActor") EventFilter.info (start="Printing from Student Actor", occurrences=1).intercept{ studentRef!InitSignal } } }本博客文章除特别声明,全部都是原创!
原创文章版权归过往记忆大数据(过往记忆)所有,未经许可不得转载。
本文链接: 【Akka学习笔记:Actor消息处理-请求和响应(2)】(https://www.iteblog.com/archives/1163.html)