Java 在Akka消息中发送行为

Java 在Akka消息中发送行为,java,akka,actor,Java,Akka,Actor,直接从Akka文档: 参与者被设计成行为和状态的容器,采用这种方式,不在消息中定期发送行为(使用Scala闭包可能很有诱惑力)。其中一个风险是在参与者之间意外地共享可变状态,不幸的是,这种违反参与者模型的行为破坏了使参与者中的编程成为如此美妙体验的所有属性 让我困惑的是: “…接受这意味着不在消息中定期发送行为…” 有人能给我一个具体的例子,说明他们所说的“在消息中发送行为”,然后解释这是如何违反“参与者模型”的吗 我使用的是Java API(不是Scala),因此我只关心它与Java 8的关系

直接从Akka文档:

参与者被设计成行为和状态的容器,采用这种方式,不在消息中定期发送行为(使用Scala闭包可能很有诱惑力)。其中一个风险是在参与者之间意外地共享可变状态,不幸的是,这种违反参与者模型的行为破坏了使参与者中的编程成为如此美妙体验的所有属性

让我困惑的是:

“…接受这意味着不在消息中定期发送行为…”

有人能给我一个具体的例子,说明他们所说的“在消息中发送行为”,然后解释这是如何违反“参与者模型”的吗


我使用的是Java API(不是Scala),因此我只关心它与Java 8的关系。不要在消息中发送函数(“行为”),因为您可能会关闭另一个参与者的内部状态。

使用Java 8的具体示例:

class MyActor extends AbstractActor {
  public MyActor(ActorRef someOther) {
    final Props props = Props.create(SomeActor.class);
    final PartialFunction<Object, BoxedUnit> behavior =
      ReceiveBuilder
        .match(String.class, s -> getContext().actorOf(props, s))
        .build();

    receive(ReceiveBuilder
      .matchAny(x -> someOther.tell(behavior, self()))
      .build()
    );
  }
}
类MyActor扩展了AbstractActor{
公共MyActor(ActorRef Somether){
final Props Props=Props.create(SomeActor.class);
最终部分功能行为=
接收生成器
.match(String.class,s->getContext().actorOf(props,s))
.build();
接收(接收)生成器
.matchAny(x->somether.tell(behavior,self()))
.build()
);
}
}

如果
someOther
引用的参与者要执行我们发送给它的行为,那么它将使用我们的ActorContext,而不是自己的ActorContext。这将导致未定义的行为,它会破坏封装。一个参与者不得对另一个参与者调用任何方法。只有这样,我们才能保证在Actor中,您可以单线程编程,而不需要任何同步原语(如
synchronized
或锁/信号量)。

谢谢@Ryan(+1)-请查看我的更新,因为我应该指定我使用的是Java API,而不是Scala。你能用Java提供一个具体的例子吗?我仍然没有从树上看到森林。Java 8 lambda是函数,“函数”一点也不意味着Scala。啊,谢谢@RolandKuhn,这很有意义。参与者永远不能直接调用其他参与者方法;他们必须使用不可变的消息来调用所需的功能。