在Akka中发送来自非参与者的消息

时间:2013-09-05 20:34:50

标签: java akka

如果我打电话

actorRef.tell("MSG", null);

来自非演员

它仍然是线程安全的吗?和async一样立即完成?

消息是不可变的。

基本上我的代码是:

class NonActor {
    ....

    public void tellTest() {

         actorRef.tell("MSG", null);
    }
}

4 个答案:

答案 0 :(得分:5)

基本上actorRef.tell("MSG", null);会创建一个类似

的记录
(actorRef, Envelope(msg, sender))

并将其放入ActorSystem的消息队列中。因此tell没有以任何方式链接到演员。 tell方法本身无疑是线程安全的。

答案 1 :(得分:1)

它是否是线程安全的,取决于你的应用程序的其余部分。演员本身并不是线程安全的;您可以像使用任何应用程序实体一样共享可变状态。但tell调用将立即返回,因为它是异步的。

答案 2 :(得分:1)

只需使用!运算符。

在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!

答案 3 :(得分:0)

null as sender意味着接收actor无法执行sender()。tell()来回复你的消息。