scala基於事件抽象

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

相關文章
相關標籤/搜索