java - 如何对 Akka actor 系统进行阻塞/同步调用?

标签 java akka actor

Akka 2.4.1 Java API 此处。我现在没有足够的资源来学习 Scala,所以我要求这里的代码示例也使用 Java API。

我有一个现有的ActorSystem,它充满了异步 Actor ,而且工作得很好。我现在需要在同步上下文中重用这个 Actor 系统,如下所示:

// Groovy pseudo-code; NOT inside the actor system here!
ComputationRequest request = new ComputationRequest(1, 7, true)
MasterActor master = actorSystem.get(...)
ComputationResult result = actorSystem.tell(master, request)

在 Akka 的文档中,我没有看到将请求发送到 Actor 系统(从外部)然后检索结果的清晰示例。我可以在这里使用 Futures 吗?在 Akka(代码示例)中处理此模式的标准方法是什么?

最佳答案

ask模式做你想要的。它期望目标参与者通过告诉getSender()来“返回”响应。您将获得一个 Future 响应并可以使用它(如果必须的话,可以阻止)。

import akka.dispatch.*;
import scala.concurrent.ExecutionContext;
import scala.concurrent.Future;
import scala.concurrent.Await;
import scala.concurrent.Promise;
import akka.util.Timeout;


ComputationRequest request = new ComputationRequest(1, 7, true);
MasterActor master = actorSystem.get(...);

Timeout timeout = new Timeout(Duration.create(5, "seconds"));
Future<Object> future = Patterns.ask(master, request, timeout);
ComputationResult result = (ComputationResult) Await.result(future, timeout.duration());

关于java - 如何对 Akka actor 系统进行阻塞/同步调用?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35418946/

相关文章:

java - 为什么 akka 需要不可变消息

java - 在 Akka Http 中发送大量对象列表

java - 我可以为某些 Actor 的自动名称添加前缀吗?

java - 使用 Spring Security 的匿名用户计数

java - Akka Java setReceiveTimeout 用法

java - 有没有办法在在线 Office 365 中打开 Azure 存储帐户中的文件?

akka - 如何在 Akka 中广播所有内容?

akka - 为什么 Akka actor 在停止指令后打印?

java - 如何从 Swift 原生代码到 Flutter 的 'put' 参数

c# - c# 中的 java.util.zip.deflater 等价物