akka关闭发件人

时间:2017-05-21 15:21:54

标签: scala akka

尝试了解以下使用发件人是否安全。 我在一些posts上看到,关闭发件人是不安全的,但如果调用是by value,则在调用方法时会评估sender(),对吗? 以下模式安全吗?

1

context.system.scheduler.scheduleOnce(1 second, self, "foo")(executor = context.dispatcher, sender = sender())

2

def receive: Receive = {
    case "Process" => context.become(processing(sender())
}
def processing(replyTo: ActorRef): receive = {...}

3

def receive: Receive = {
case "Process" => 
context.actorOf(Props(new FooActor(replyTo = sender())))
}

1 个答案:

答案 0 :(得分:2)

当人们说"关闭"通过sender()函数,它们意味着捕获"这个"引用到lambda中,以便稍后调用sender()。这是不安全的,因为sender()稍后返回的值与它当前的值不同。如果您捕获(或"关闭")sender()当前返回的值,那很好。

您是否将sender()作为函数或sender()捕获为值并不总是很清楚,因为它会根据您是将其传递给按值调用还是按名称调用而有所不同正如你所指出的,功能。

维克多在评论中指出:

1和2都没问题,因为你正在捕获sender()的当前值。

3不安全,因为" Props.apply"是一个按名称传递的函数,所以你无意中将sender()作为一个函数而不是一个值关闭。

我不知道有什么简单的方法来区分这两种情况,除了检查文档(或在IDE中点击,如果它支持它)。