Akka and cake pattern

前端 未结 2 1288
攒了一身酷
攒了一身酷 2021-02-07 23:53

I\'m confused how to ensure that my Actors have the appropriate dependencies using the cake pattern. I\'m still getting to grips with this, and I can\'t find any examples anywhe

2条回答
  •  孤城傲影
    2021-02-08 00:40

    Actors as dependency:

    trait DBComponent {
       def db: ActorRef // no compile time guarantees
    
       type K
       type V
    
       object DBActor {
          case class Put(key: K, value: V)
          case class Get(key: K)
       }
    
       class DBActor {
          import DBActor._
          val db = scala.collection.mutable.Map.empty[K, V]
          def receive = {
             case Put(k, v) => db.put(k, v)
             case Get(k) => sender ! db.get(k)
          }
       }
    }
    
    trait ServiceComponent {
       this: DBComponent =>
    
       import DBActor._
    
       // you could be talking to deadLetters for all you know
       def put(k: K, v: V): Unit = db ! Put(k, v)
       def get(k: K): Option[V] = {
          implicit val timeout = Timeout(5 seconds)
          val future = ask(actor, Get(k)).mapTo[Option[V]]
          Await.result(future, timeout.duration)
       }
    }
    

    Actors having dependencies (where there is nothing special to it):

    trait DBComponent {
       def db: DB
    
       type K
       type V
    
       trait DB {
          def put(key: K, value: V): Unit
          def get(key: K): Option[V]
       }
    }
    
    trait ServiceComponent {
       this: DBComponent =>
    
       object ServiceActor {
          case class Put(key: K, value: V)
          case class Get(key: K)
       }
    
       class ServiceActor {
          import ServiceActor._
          def receive = {
             case Put(k, v) => db.put(k, v) // db is in scope
             case Get(k) => sender ! db.get(k)
          }
       }
    }
    

提交回复
热议问题