如果我打电话
actorRef.tell("MSG", null);
来自非演员
它仍然是线程安全的吗?并且 async as in 立即完成?
消息是不可变的。
基本上我的代码是:
class NonActor {
....
public void tellTest() {
actorRef.tell("MSG", null);
}
}
基本上actorRef.tell("MSG", null);
创建了一个像
(actorRef, Envelope(msg, sender))
并将其放入ActorSystem
的消息队列中。因此tell
与演员没有任何联系。该tell
方法本身无疑是线程安全的。
它是否是线程安全的取决于您的应用程序的其余部分。Actor 本身并不是线程安全的。您可以像与任何应用程序实体一样共享可变状态。但是tell
调用会立即返回,因为它是异步的。
只需使用!
运算符。
在 Akka classic 2.6 中是这样定义的:
trait ScalaActorRef { ref: ActorRef =>
/**
* Sends a one-way asynchronous message. E.g. fire-and-forget semantics.
* <p/>
*
* If invoked from within an actor then the actor reference is implicitly passed on as the implicit 'sender' argument.
* <p/>
*
* This actor 'sender' reference is then available in the receiving actor in the 'sender()' member variable,
* if invoked from within an Actor. If not then no sender is available.
* <pre>
* actor ! message
* </pre>
* <p/>
*/
def !(message: Any)(implicit sender: ActorRef = Actor.noSender): Unit
}
actorRef.tell("MSG", null)
就像actorRef.!("MSG")(null)
,这迫使发件人成为null
。
如果您!
在 Actor 外部使用,则不会找到隐式发送者,因此Actor.noSender
编译器将放置默认值。
只要发送者的缺失应该在编译时自动解决,明确告诉 Akka 它null
可能是容易出错的。
永远不要使用null
Scala !
null as sender 表示接收参与者无法执行 sender().tell() 来回答您的消息。