设为首页 加入收藏

TOP

Akka(6): become/unbecome:运算行为切换(三)
2017-10-09 14:06:33 】 浏览:5780
Tags:Akka become/unbecome 运算 行为 切换
lect from table x
") dbActor ! Disconnected

运算结果:

[INFO] [06/09/2017 11:54:57.264] [dbSystem-akka.actor.default-dispatcher-4] [akka://dbSystem/user/dbActor] Logon to DB.
[INFO] [06/09/2017 11:54:57.273] [dbSystem-akka.actor.default-dispatcher-4] [akka://dbSystem/user/dbActor] Reading from DB: Select from table x
[INFO] [06/09/2017 11:54:57.273] [dbSystem-akka.actor.default-dispatcher-4] [akka://dbSystem/user/dbActor] Logoff from DB.

漏掉了DBWrite操作。可以理解,所有connected状态之前的任何操作都不会真正生效。Akka提供了个Stash trait能把一个receive函数未处理的消息都存起来。然后用unstash()可以把存储的消息都转移到本Actor的邮箱里。我们可以用Stash来解决这个消息遗失问题:

  def disconnected: Receive = { case Connected => log.info("Logon to DB.") context.become(connected) unstashAll() case _ => stash() }

所有消息遗失都是在Disconnected状态内发生的。在disconnected里我们用stash把所有非Connected消息存起来,然后在转换成Connected状态时把这些消息转到信箱。再看看运算结果:

object BecomeDB extends App { val dbSystem = ActorSystem("dbSystem") val dbActor = dbSystem.actorOf(DBOActor.props,"dbActor") dbActor ! DBWrite("Update table x") dbActor ! Connected dbActor ! DBRead("Select from table x") dbActor ! Disconnected scala.io.StdIn.readLine() dbSystem.terminate() }

[INFO] [06/09/2017 12:01:54.518] [dbSystem-akka.actor.default-dispatcher-4] [akka://dbSystem/user/dbActor] Logon to DB.
[INFO] [06/09/2017 12:01:54.528] [dbSystem-akka.actor.default-dispatcher-4] [akka://dbSystem/user/dbActor] Writing to DB: Update table x
[INFO] [06/09/2017 12:01:54.528] [dbSystem-akka.actor.default-dispatcher-4] [akka://dbSystem/user/dbActor] Reading from DB: Select from table x
[INFO] [06/09/2017 12:01:54.528] [dbSystem-akka.actor.default-dispatcher-4] [akka://dbSystem/user/dbActor] Logoff from DB.

显示结果正确。下面就是整个示范的源代码:

import akka.actor._ sealed trait DBOperations case class DBWrite(sql: String) extends DBOperations case class DBRead(sql: String) extends DBOperations sealed trait DBStates case object Connected extends DBStates case object Disconnected extends DBStates object DBOActor { def props = Props(new DBOActor) } class DBOActor extends Actor with ActorLogging with Stash { override def receive: Receive = disconnected def disconnected: Receive = { case Connected => log.info("Logon to DB.") context.become(connected) unstashAll() case _ => stash() } def connected: Receive = { case Disconnected => log.info("Logoff from DB.") context.unbecome() case DBWrite(sql) => log.info(s"Writing to DB: $sql") case DBRead(sql) => log.info(s"Reading from DB: $sql") } } object BecomeDB extends App { val dbSystem = ActorSystem("dbSystem") val dbActor = dbSystem.actorOf(DBOActor.props,"dbActor") dbActor ! DBWrite("Update table x") dbActor ! Connected dbActor ! DBRead("Select from table x") dbActor ! Disconnected scala.io.StdIn.readLine() dbSystem.terminate() }

 

 

 

 

 

 

 

 

 

 

 

 

 

首页 上一页 1 2 3 下一页 尾页 3/3/3
】【打印繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部
上一篇Akka(3): Actor监管 - 细述Bac.. 下一篇Akka(7): FSM:通过状态变化来..

最新文章

热门文章

Hot 文章

Python

C 语言

C++基础

大数据基础

linux编程基础

C/C++面试题目