Akka 阿克卡和蛋糕图案

Akka 阿克卡和蛋糕图案,akka,cake-pattern,Akka,Cake Pattern,我不知道如何使用蛋糕模式确保我的参与者具有适当的依赖关系。我仍在努力解决这个问题,我在任何地方都找不到任何例子。我基本上只是在寻找一个教程/资源 干杯,克里斯 作为依赖项的参与者: trait DBComponent { def db: ActorRef // no compile time guarantees type K type V object DBActor { case class Put(key: K, value: V) ca

我不知道如何使用蛋糕模式确保我的参与者具有适当的依赖关系。我仍在努力解决这个问题,我在任何地方都找不到任何例子。我基本上只是在寻找一个教程/资源

干杯,克里斯

作为依赖项的参与者:

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)
   }
}
具有依赖关系的参与者(没有什么特别之处):


正如Owen所指出的,另外一个问题是使用
actorOf(Props[MyClass])
创建演员对内部类不起作用。Ie:以下操作将失败:

trait MyComponent {
  class MyActor {
    def receive = ...
  }
}

new MyComponent {
  val myActorRef = system.actorOf( Props[MyActor] )
}
根据

如果它们未在顶级对象中声明,则 实例的this引用需要作为第一个参数传递

但是,scaladoc Props方法签名似乎不支持这一点。我发现解决这个问题的唯一方法是使用Props(actor:actor)构造函数,实例化actor mysql并将其传递给Props

val myActorRef = system.actorOf( Props( new MyActor(arg1, arg2) ) )

我很想知道是否有更好的方法。

另一种方法呢,不是将参与者作为依赖项,而是将参与者作为依赖项,这就是我认为OP要问的。但我的问题是,当ServiceActor需要将消息传递给其他ServiceActor时,我阅读的标准方式似乎是使用“context.actorOf[OtherServiceActor]”方法来创建所需的参与者。在这一点上,如果OtherServiceActor被包装在一个trait中,因为它无法在该范围内实例化它,那么我会得到错误。好的,开始键入一个该死的编辑,并在中途实现了我自己问题的答案。trait中定义的Actor类有效吗?据我所知,Akka actors不能是非静态的内部类,否则它将在创建过程中失败
Akka.actor.ActoriInitializationException:exception
Ok,只是尝试了一下,如果用
system.actorOf(Props[ServiceActor])
实例化,它确实会抛出异常,但可以与
system.Actorf(Props(new ServiceActor))一起使用
您可以使用actorOf(Props(classOf[SomeActor],someArgument))。
val myActorRef = system.actorOf( Props( new MyActor(arg1, arg2) ) )