【问题标题】:Play Java Akka - Await.result expecting awaitable object and not accepting Future<Object>玩 Java Akka - Await.result 期望等待对象而不接受 Future<Object>
【发布时间】:2015-06-16 10:26:20
【问题描述】:

我是玩框架和 AKKA 的新手,我是一名 Java 开发人员。我使用 Play 2.3.7 和 IntelliJ 14。我调用了 Pattern.ask,这将返回一个 Future 对象,该对象具有来自 Web 服务调用的字符串。通过控制台,我可以发现我的演员能够接收请求并执行操作。我不知道如何解析它。我正在尝试使用 Await.result 来阅读未来。但是这个 Await.result 需要等待对象。如果我传递 Future 对象,它会引发编译器异常。请帮忙。

public Result invoke(String message) {

try {
    System.out.println("invoke ");
    MySampleMessage msg = new MySampleMessage(message);
    System.out.println(msg.getMessage());
    Future<Object> futr = (Future<Object>) Patterns.ask(myActor, msg, localConfig.getTimeOut());
    System.out.println("invoke 1");
    ////Promise<Object> promise = Promise.wrap(futfure);

    String msg1 = Await.result(futr, Duration.create(10, TimeUnit.MILLISECONDS));
    System.out.println("invoke 2 ");
    return  play.mvc.Results.ok("Success " + msg1);
}
catch(Exception e)
{
    return (play.mvc.Results.ok("Exception"));
}

}

还有其他方法可以解析来自async 演员的响应吗?

【问题讨论】:

  • 您遇到的编译器异常究竟是什么?因为如果它是“类型不匹配”,您只需要将 Await.result 值转换为类似的字符串。 String msg1 = (String) Await.result(...).
  • 我遇到了类似的错误 - 预期的 Awaitable,但在 Await.result 中的 aruement{1} 处找到了 scala.concurrent.Future

标签: java akka


【解决方案1】:

您必须小心标准 java 类型和 Akka 类型之间的名称冲突。例如,Java 有一个 java.util.concurrent.Future 类型,而 Akka 的 Patterns.ask() 返回一个 akka.dispatch.Future

检查您的演员表Future&lt;Object&gt;。它永远不会在运行时工作,并且稍后会检测到类型不兼容,因为 Java 的未来与 Akka 的 Awaitable 无关。

【讨论】:

    【解决方案2】:

    我找到了一种方法来解析来自参与者的响应。创建一个函数,包装你的未来并将其映射到一个函数,该函数将检查响应的实例类型并返回结果。下面是工作代码 sn-p。

    Future<Object> futre = (Future<Object>) Patterns.ask(myActor, msg,      localConfig.getTimeOut());
    
    F.Function<Object, Result> function = new F.Function<Object, Result>()
    {
        public Result apply(Object response)
        {
            String s = String.valueOf(response);
            if(response instanceof String) return play.mvc.Results.ok(s);
            else  return play.mvc.Results.ok("fail");
        }
    };
    
    return Promise.wrap(futre).map(function);
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-09-30
      • 1970-01-01
      • 1970-01-01
      • 2015-04-25
      相关资源
      最近更新 更多