Scala 如何从演员外部发送Akka并且仍然能够使用sender
我是斯卡拉和阿克卡的新手。我将在Coursera完成反应式编程课程,我决定在重构过程中进行一些重构。我发现我的代码无法工作,因为行为会影响以下代码:Scala 如何从演员外部发送Akka并且仍然能够使用sender,scala,akka,implicit,Scala,Akka,Implicit,我是斯卡拉和阿克卡的新手。我将在Coursera完成反应式编程课程,我决定在重构过程中进行一些重构。我发现我的代码无法工作,因为行为会影响以下代码: package common import akka.actor.{ActorRef, ActorSystem, Props, Actor} import akka.event.LoggingReceive object NotWorkingActorApp extends App { case class Start() case clas
package common
import akka.actor.{ActorRef, ActorSystem, Props, Actor}
import akka.event.LoggingReceive
object NotWorkingActorApp extends App {
case class Start()
case class FromOuter()
case class FromInner()
class InnerProxy {
def sendInner(innerParam: ActorRef): Unit = {
innerParam.!(FromOuter)
}
}
class Outer extends Actor {
var inner = context.system.actorOf(Props[Inner], name = "inner")
var proxy = new InnerProxy
def receive = LoggingReceive {
case Start => proxy.sendInner(inner)
case FromInner => println("Finish!")
}
}
class Inner extends Actor {
def receive = LoggingReceive {
case FromOuter => sender.!(FromInner)
}
}
val system = ActorSystem("InnerOuterSystem")
val outer = system.actorOf(Props[Outer], name = "outer")
outer.!(Start)
}
运行这部分代码后的日志如下所示:
[DEBUG] [08/25/2014 23:37:14.255] [main] [EventStream(akka://InnerOuterSystem)] logger log1-Logging$DefaultLogger started
[DEBUG] [08/25/2014 23:37:14.257] [main] [EventStream(akka://InnerOuterSystem)] Default Loggers started
[DEBUG] [08/25/2014 23:37:14.282] [InnerOuterSystem-akka.actor.default-dispatcher-2] [akka://InnerOuterSystem/user/outer] received handled message Start
[DEBUG] [08/25/2014 23:37:14.284] [InnerOuterSystem-akka.actor.default-dispatcher-2] [akka://InnerOuterSystem/user/inner] received handled message FromOuter
[INFO] [08/25/2014 23:37:14.304] [InnerOuterSystem-akka.actor.default-dispatcher-4] [akka://InnerOuterSystem/deadLetters] Message [common.NotWorkingActorApp$FromInner$] from Actor[akka://InnerOuterSystem/user/inner#-2100738560] to Actor[akka://InnerOuterSystem/deadLetters] was not delivered. [1] dead letters encountered. This logging can be turned off or adjusted with configuration settings 'akka.log-dead-letters' and 'akka.log-dead-letters-during-shutdown'.
所以看起来内部无法看到其发送者。若方法“sendInner”在外部类中,那个么一切都能正常工作,但我想拥有InnerProxy类并使用它,因为我喜欢有良好的模块化代码。我该怎么做
以下版本:
scalaVersion := "2.10.2"
"com.typesafe.akka" %% "akka-actor" % "2.2.3",
"com.typesafe.akka" %% "akka-testkit" % "2.2.3"
解决此问题的一种可能方法是重新定义
InnerProxy
,如下所示:
class InnerProxy {
def sendInner(innerParam: ActorRef)(implicit senderRef:ActorRef): Unit = {
innerParam ! FromOuter
}
}
只要您从actor实例内部调用sendInner
,那么您总是有一个隐式ActorRef
作为self
可用。结果是,调用sendInner
的参与者最终将成为发送者,无论参与者接收到什么消息,然后都可以得到回复