java akka:向祖父母发回消息

java akka:向祖父母发回消息,java,akka,Java,Akka,我创造了3个级别的演员。 一级是主管演员。主管参与者将向Level2参与者触发消息,并根据收到的消息类型,根据子参与者(Level1和Level2)返回的响应采取行动。 以下是主管的代码 if (message instanceof OutBoundDataExportDTO) { // This to trigger query processor OutBoundDataExportDTO data = OutBoundDataExportDTO.class.cast(me

我创造了3个级别的演员。 一级是主管演员。主管参与者将向Level2参与者触发消息,并根据收到的消息类型,根据子参与者(Level1和Level2)返回的响应采取行动。 以下是主管的代码

if (message instanceof OutBoundDataExportDTO) {
    // This to trigger query processor

    OutBoundDataExportDTO data = OutBoundDataExportDTO.class.cast(message);
    LOGGER.info("Received:  " + data.toString());
    ActorRef ruleInstExportActor = actorSystem
        .actorOf(Props.create(OutboundsQueryActor.class, applicationContext)
        .withRouter(new RoundRobinPool(5)));
    ruleInstExportActor.tell(data, getSelf());

} else if (message instanceof TaskCompleteMsg) {
    TaskCompleteMsg taskCompleteMsg= TaskCompleteMsg.class.cast(message);
    taskService.update(taskCompleteMsg);
}
在2级参与者中,工作被委托给某个处理器。此处理器将产生另一个参与者(3级参与者)。现在,我需要将taskcomplete的响应从Level 3 actor返回到Level 1 actor(supervisor actor),以便它根据响应采取行动

下面是Level2 actor的示例代码:

if (message instanceof Level1ActorMessage) {
     OutboundQueryProcessor queryProcessor =  queryProcessorFactory
         .getQueryProcessor(queryName);
     response = queryProcessor.executeQuery(templateId, queryData, task);

} else if (message instanceof Level3ActorTaskCompleteMsg) { // This is the response from Level 3 actor, once it has completed 
    ActorRef parent = getContext().parent(); // This gives me the   parent(Level2)
    // How do i send it back to its parent
    // parent.tell(returnResponse, parent);
}
if (message instanceof Level1ActorMessage) {
    OutboundQueryProcessor queryProcessor = queryProcessorFactory.getQueryProcessor(queryName);
    response = queryProcessor.executeQuery(templateId, queryData, task);

} else if(message instanceof Level3ActorTaskCompleteMsg){// This is the response from Level 3 actor, once it has completed 
    ActorRef parent = getContext().parent();// This gives me the   parent(Level2)
    //How do i send it back to its parent
    //   parent.tell(returnResponse, parent);
}

如何将第三级演员(儿童)的回复发送回祖父母(第一级)

在Level2 actor的代码段中:

if (message instanceof Level1ActorMessage) {
     OutboundQueryProcessor queryProcessor =  queryProcessorFactory
         .getQueryProcessor(queryName);
     response = queryProcessor.executeQuery(templateId, queryData, task);

} else if (message instanceof Level3ActorTaskCompleteMsg) { // This is the response from Level 3 actor, once it has completed 
    ActorRef parent = getContext().parent(); // This gives me the   parent(Level2)
    // How do i send it back to its parent
    // parent.tell(returnResponse, parent);
}
if (message instanceof Level1ActorMessage) {
    OutboundQueryProcessor queryProcessor = queryProcessorFactory.getQueryProcessor(queryName);
    response = queryProcessor.executeQuery(templateId, queryData, task);

} else if(message instanceof Level3ActorTaskCompleteMsg){// This is the response from Level 3 actor, once it has completed 
    ActorRef parent = getContext().parent();// This gives me the   parent(Level2)
    //How do i send it back to its parent
    //   parent.tell(returnResponse, parent);
}
您有一行
ActorRef parent=getContext().parent();//这将为我提供父级(Level2)
,它为Level2的父级(即Level1)提供ActorRef,它是Level3的祖父母

因此,如果您想告诉Level1 Level3已经完成,那么在Level2 actor中,您可以使用:

parent.tell(message, getSelf());
这将把
Level3ActorTaskCompleteMsg
传递到Level1,发送者将是Level2,或者您可以使用:

parent.forward(message, getContext());
它将把
Level3ActorTaskCompleteMsg
转发给Level1,当Level1是Level3时,即它的孙辈

无论采用哪种方式,您都将实现将
Level3ActorTaskCompleteMsg
从Level3发送到Level1的祖父母的目标


请参见Level2 actor代码片段中的

if (message instanceof Level1ActorMessage) {
     OutboundQueryProcessor queryProcessor =  queryProcessorFactory
         .getQueryProcessor(queryName);
     response = queryProcessor.executeQuery(templateId, queryData, task);

} else if (message instanceof Level3ActorTaskCompleteMsg) { // This is the response from Level 3 actor, once it has completed 
    ActorRef parent = getContext().parent(); // This gives me the   parent(Level2)
    // How do i send it back to its parent
    // parent.tell(returnResponse, parent);
}
if (message instanceof Level1ActorMessage) {
    OutboundQueryProcessor queryProcessor = queryProcessorFactory.getQueryProcessor(queryName);
    response = queryProcessor.executeQuery(templateId, queryData, task);

} else if(message instanceof Level3ActorTaskCompleteMsg){// This is the response from Level 3 actor, once it has completed 
    ActorRef parent = getContext().parent();// This gives me the   parent(Level2)
    //How do i send it back to its parent
    //   parent.tell(returnResponse, parent);
}
您有一行
ActorRef parent=getContext().parent();//这将为我提供父级(Level2)
,它为Level2的父级(即Level1)提供ActorRef,它是Level3的祖父母

因此,如果您想告诉Level1 Level3已经完成,那么在Level2 actor中,您可以使用:

parent.tell(message, getSelf());
这将把
Level3ActorTaskCompleteMsg
传递到Level1,发送者将是Level2,或者您可以使用:

parent.forward(message, getContext());
它将把
Level3ActorTaskCompleteMsg
转发给Level1,当Level1是Level3时,即它的孙辈

无论采用哪种方式,您都将实现将
Level3ActorTaskCompleteMsg
从Level3发送到Level1的祖父母的目标


参见

请在此发布更详细的问题。请提供相关的代码库,以便更容易理解正在发生的事情。另外,您在这方面做了哪些尝试?请在此发布更详细的问题。请提供相关的代码库,以便更容易理解正在发生的事情。另外,您在这方面做了哪些尝试?嗨,nickebbitt,出于某种原因,这行
ActorRef parent=getContext().parent()
提供了Level2 actor的引用(请参见该行后面的注释部分)。我认为这是因为收到的消息来自Level3 actor,其父级将是Level2 actor。现在,我没有办法获得Level2的父级的引用。如果您确实在Level2 actor中,并且Level2是由Level1 one创建的,那么这是不可能的,Level2不能是它自己的父级。如果消息的发送源不相关,则消息发送者的ActorRef来自getSender()Hi nickebbitt,出于某种原因,此行
ActorRef parent=getContext().parent()
提供了Level2 actor的引用(请参见该行后面的注释部分)。我认为这是因为收到的消息来自Level3 actor,其父级将是Level2 actor。现在,我没有办法获得Level2的父级的引用。如果您确实在Level2 actor中,并且Level2是由Level1 one创建的,那么这是不可能的,Level2不能是它自己的父级。如果消息的发送源不相关,则消息发送者的ActorRef来自getSender()