import UserStorage._ import akka.actor.{Props, ActorSystem, Stash, Actor} import scala.sys.Prop /** * Created by zzg on 16-4-22. */ case class User2(userName:String,email:String) object UserStorage{ trait DBOperation object DBOperation{ case object Create extends DBOperation case object Update extends DBOperation case object Read extends DBOperation case object Delete extends DBOperation } case object Connect case object Disconnect case class Operation (dBOperation: DBOperation,user2:Option[User2]) } class UserStorage extends Actor with Stash { def receive = disconnected def connected :Actor.Receive = { case Disconnect => println("User Storage Disconnect from DB") //從新設置 context.unbecome() case Operation(op,user) => println(s"User Storage receive ${op} to do in user:${user}") } def disconnected : Actor.Receive = { case Connect => println(s"User Storage connect to DB") unstashAll() //動態切換receive context.become(connected) case _ => stash() } } object BecomeHotswap extends App{ import UserStorage._ val system = ActorSystem("beconHostwap") val userStorage = system.actorOf(Props[UserStorage],"userStorage") userStorage ! Operation(DBOperation.Create,Some(User2("Admin", "admin@packt.com"))) userStorage ! Connect userStorage ! Disconnect Thread.sleep(100) system.shutdown() }
將事件抽象爲對象:DBOperation,經過case基於事件判斷不一樣的事務規則scala
用context.become,unbecome動態熱插拔actor頗有用處
code