Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/spring/11.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
Akka,在使用简单Java对象和未来时,如何保留发送方引用?_Java_Spring_Akka - Fatal编程技术网

Akka,在使用简单Java对象和未来时,如何保留发送方引用?

Akka,在使用简单Java对象和未来时,如何保留发送方引用?,java,spring,akka,Java,Spring,Akka,我有一个Java类,它创建了一个supervisor Actor,然后为它需要生成的每个请求创建一个子Actor Java类使用Future从supervisor Actor获取响应 主管使用tell和sender引用从子参与者处获取响应 但是,我的supervisor Actor是一个单例作用域bean,因此每次Java类向supervisor发出请求时,我都需要找到一种存储发送方引用的方法。最好的方法是什么?我认为单例作用域不是一个好的isea,因为Akka需要能够在异常发生时重新启动参与者

我有一个Java类,它创建了一个supervisor Actor,然后为它需要生成的每个请求创建一个子Actor

  • Java类使用Future从supervisor Actor获取响应
  • 主管使用tell和sender引用从子参与者处获取响应

  • 但是,我的supervisor Actor是一个单例作用域bean,因此每次Java类向supervisor发出请求时,我都需要找到一种存储发送方引用的方法。最好的方法是什么?

    我认为单例作用域不是一个好的isea,因为Akka需要能够在异常发生时重新启动参与者。这可能会导致一些奇怪的问题。我们自己使用原型范围

    除此之外,一种可能是通过将服务器传递给参与者,将接收请求和发送响应分离开来,您只需使用forward而不是tell,管道中的最后一个参与者将响应发送者。这样,主管就不需要关心响应。显然,如果您的主管只向发件人发送响应,那么这是理想的选择

    如果在发送响应之前需要进行一些处理,您可以创建一个临时参与者并将其传递给发送者引用,然后让该参与者收集结果,将响应发送到您的未来并停止自己。如果需要等待多个响应并对其进行聚合,这一点尤其有用


    您还可以将发件人引用添加到您从主管发送给演员并返回给主管的消息中。简单但有效。

    是的,使用forward是管理将响应返回给正确发送者的一种好方法,但是阻止请求的能力是关键。如果我不能将actor标记为singleton,您建议我怎么做?节流与singleton有什么关系?就像我说的,如果您只创建一个参与者,那么您将只有一个参与者,不管它是单例范围还是原型范围。如果您创建了多个参与者,但只需要一个参与者,并使用singleton解决了这个问题,那么这就是一个问题。除此之外,节流确实不容易做到。文档中有这样一种模式:我应该更详细一些。我正在使用Akka的TimerBasedThrottler类在我的应用程序中实现节流。此类允许您在创建参与者时指定限制速率。然后,新的ActorRef可以指定消息可以转发到的子Actor。消息的处理速度不会超过在创建第一个actor期间指定的限制速率……这就是为什么我想确保我只有一个actor实例,它定义了限制速率