如何在 akka 中使用发送者 ActorRef
How to work with the sender ActorRef in akka
很久以前,我了解到这段代码:
def doSome(ref: ActorRef, msg: AnyRef): Unit = {
... some routine ...
ref ! msg
}
def receive = {
case x: Foo => doSome(sender(), x)
}
必须
...
def receive = {
case x: Foo =>
val s = sender()
doSome(s, x)
}
因为 sender() 是一个函数,在应用之前有人可能会更改 context.sender() 值
问题1:非Future函数是否存在真值?或者像第一个变体一样安全地写?
问题2:有没有办法这样写?
def receive = {
case x: Foo => sendrer() {s => doSome(s, x)}
}
只要执行给定消息的接收行为,sender()
的结果将保持不变。
所以回答你的第一个问题:是的,只要你
像第一个变体一样这样做是安全的
- 不要将
sender()
返回的值分配给 actor 中的字段
- 将该值传递给你的 actor 之外的某个地方
但是,我不建议将 sender()
的结果分配给变量。相反,我建议调用 sender()
并直接向其发送消息(这将是我对问题 2 的回答):
def receive = {
case x: Foo => doSome(x)
}
def doSome(msg: Foo) = {
// your logic here
sender() ! msg
}
很久以前,我了解到这段代码:
def doSome(ref: ActorRef, msg: AnyRef): Unit = {
... some routine ...
ref ! msg
}
def receive = {
case x: Foo => doSome(sender(), x)
}
必须
...
def receive = {
case x: Foo =>
val s = sender()
doSome(s, x)
}
因为 sender() 是一个函数,在应用之前有人可能会更改 context.sender() 值
问题1:非Future函数是否存在真值?或者像第一个变体一样安全地写?
问题2:有没有办法这样写?
def receive = {
case x: Foo => sendrer() {s => doSome(s, x)}
}
只要执行给定消息的接收行为,sender()
的结果将保持不变。
所以回答你的第一个问题:是的,只要你
像第一个变体一样这样做是安全的- 不要将
sender()
返回的值分配给 actor 中的字段 - 将该值传递给你的 actor 之外的某个地方
但是,我不建议将 sender()
的结果分配给变量。相反,我建议调用 sender()
并直接向其发送消息(这将是我对问题 2 的回答):
def receive = {
case x: Foo => doSome(x)
}
def doSome(msg: Foo) = {
// your logic here
sender() ! msg
}