Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/383.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 阿克卡演员模型。为什么要向self发送消息?_Java_Akka - Fatal编程技术网

Java 阿克卡演员模型。为什么要向self发送消息?

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

我是akka的新手,查看现有代码,看到一个演员从其他人那里获得消息1,然后将消息2发送给自己。我理解通过方法调用发送消息的优势是akka的关键。但是,我不认为将消息发送到getSelf()有什么好处。我看到的代码如下所示:


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来说,仍然不清楚,我建议您详细了解消息,以及它们提供的好处。另外:发送消息不能影响参与者的内部状态?我对此非常怀疑。谢谢,我看了一些例子,然后再回到这里。