Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/scala/18.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Scala 如何从演员外部发送Akka并且仍然能够使用sender_Scala_Akka_Implicit - Fatal编程技术网

Scala 如何从演员外部发送Akka并且仍然能够使用sender

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

我是斯卡拉和阿克卡的新手。我将在Coursera完成反应式编程课程,我决定在重构过程中进行一些重构。我发现我的代码无法工作,因为行为会影响以下代码:

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
的参与者最终将成为
发送者,无论参与者接收到什么消息,然后都可以得到回复