我有一个 Spring 启动应用程序,当我停止 Spring 启动应用程序的akka演员得到终止,即使他们有消息要处理。我想改变行为,并希望即使在 Spring 启动应用程序关闭后,如果akka演员有消息,它应该处理,之后它应该得到终止,我尝试了多种事情,但没有得到任何运气,我尝试了正常关机的Spring Boot 。任何帮助都将不胜感激。先谢了🙂
q7solyqu1#
我不知道有什么方法可以实现这一点,但是您可以让参与者使用custom mailbox,它有一个MessageQueue,每当邮箱的空状态发生变化时,它就会通知全局参与者。然后注册一个协调的关闭钩子,它基本上会要求参与者在没有参与者的情况下完成一个future。请注意,由于参与者在处理消息的过程中可以向自己或其他参与者发送任意多的消息,因此无法保证会出现参与者在其各自的邮箱中没有消息的情况。因此,您可能希望有一些方法来指导参与者开始使用处理的定义,该定义需要发送更少的向前消息;因此,这类事情必须为您的应用程序自定义,并且适合您试图用应用程序解决的问题(并且不能保证存在这样的处理定义)。出于这个原因,更符合Akka习惯的做法是接受消息的传递和处理通常不一定会发生。
7tofc5zh2#
为此,可以使用协调关闭(https://doc.akka.io/docs/akka/current/coordinated-shutdown.html)。您可以在PreDestroy回调中终止系统,如下所示:
PreDestroy
CoordinatedShutdown.get(system) .runAll(CoordinatedShutdown.jvmExitReason()) .get(60, TimeUnit.SECONDS);
然后,您可以按如下方式注册您的执行元:
CoordinatedShutdown.get(system()) .addCancellableTask( CoordinatedShutdown.PhaseServiceRequestsDone(), "shutdown-actor", () -> { return Patterns.ask(self, new Stop(), Duration.ofSeconds(60)) .thenApply(msg -> Done.getInstance()); });
这将推迟系统的关闭,直到收到停止响应
2条答案
按热度按时间q7solyqu1#
我不知道有什么方法可以实现这一点,但是您可以让参与者使用custom mailbox,它有一个MessageQueue,每当邮箱的空状态发生变化时,它就会通知全局参与者。然后注册一个协调的关闭钩子,它基本上会要求参与者在没有参与者的情况下完成一个future。
请注意,由于参与者在处理消息的过程中可以向自己或其他参与者发送任意多的消息,因此无法保证会出现参与者在其各自的邮箱中没有消息的情况。因此,您可能希望有一些方法来指导参与者开始使用处理的定义,该定义需要发送更少的向前消息;因此,这类事情必须为您的应用程序自定义,并且适合您试图用应用程序解决的问题(并且不能保证存在这样的处理定义)。
出于这个原因,更符合Akka习惯的做法是接受消息的传递和处理通常不一定会发生。
7tofc5zh2#
为此,可以使用协调关闭(https://doc.akka.io/docs/akka/current/coordinated-shutdown.html)。
您可以在
PreDestroy
回调中终止系统,如下所示:然后,您可以按如下方式注册您的执行元:
这将推迟系统的关闭,直到收到停止响应