Java 阿克卡演员模型。为什么要向self发送消息?
我是akka的新手,查看现有代码,看到一个演员从其他人那里获得消息1,然后将消息2发送给自己。我理解通过方法调用发送消息的优势是akka的关键。但是,我不认为将消息发送到getSelf()有什么好处。我看到的代码如下所示:Java 阿克卡演员模型。为什么要向self发送消息?,java,akka,Java,Akka,我是akka的新手,查看现有代码,看到一个演员从其他人那里获得消息1,然后将消息2发送给自己。我理解通过方法调用发送消息的优势是akka的关键。但是,我不认为将消息发送到getSelf()有什么好处。我看到的代码如下所示: import java.util.Date; import akka.actor.AbstractLoggingActor; import akka.actor.Props; public class myActor extends AbstractLoggingAct
import java.util.Date;
import akka.actor.AbstractLoggingActor;
import akka.actor.Props;
public class myActor extends AbstractLoggingActor {
public static class Message1 {
}
public static class Message2 {
}
private Date date;
public static Props props(Date date) {
return Props.create(myActor.class, date);
}
@Override
public Receive createReceive() {
return receiveBuilder().match(Message1.class, message -> {
// some state change here, method calls, ...
getSelf().tell(new Message2(), getSelf());
}).match(Message2.class, message -> {
// some code here ...
this.doSomeLongProcessing();
}).build();
}
private void doSomeLongProcessing() {
// ... long time is taken here
}
}
最终,应该有一个对actor类中的方法的阻塞调用(例如doSomeLongProcessing()),我们将这个调用放在另一个消息处理中,这不会更好
从这个角度来看,问题是——为什么我们可能需要在阿克卡向self发送消息?
请解释一下,因为我在网上也看到了一些这样的例子。如果没有看到完整的代码和上下文,我想我无法给出真正的答案。但是,总的来说,你是对的,在正常情况下,仅仅为了继续正常处理而给自己发送消息并没有什么好处。但我认为这个例子有点做作,因为通常你不想在同一个参与者中混合阻塞和非阻塞行为。(通常,最佳做法是在一个参与者中处理message1,然后在另一个参与者中处理message2,这样您就可以将第二个参与者放入专用的线程池中,以阻止参与者。) 但是,在某些情况下,向自己发送消息是有效的。罗伯特·哈维(Robert Harvey)在上面的评论中提到了其中两个:在将来使用计时器向自己发送消息时,以及在将来完成时从内部向自己发送消息的“pipeTo”模式。(这一点很重要,因为您将不再位于完成处理程序中的参与者上下文中,因此您需要向自己发送一条消息以返回上下文。) 我还可以想到一些其他边缘案例,您可能希望向self发送消息。例如,如果您在一个阻塞参与者中,向自己发送消息实际上是一种
收益
,允许参与者处理其他消息
如果代码是公开的,我可以更详细地看一个具体的例子。提供了两篇文章来解决这个问题。@RobertHarvey谢谢,文章很长,而且内容丰富。我发现的唯一一件事是,呼叫可能会改变内部状态,而发送消息则无法。对于meI来说,仍然不清楚,我建议您详细了解消息,以及它们提供的好处。另外:发送消息不能影响参与者的内部状态?我对此非常怀疑。谢谢,我看了一些例子,然后再回到这里。