首页 文章

玩Java Akka - Await.result期待等待对象而不接受Future <Object>

提问于
浏览
1

我是新玩框架和AKKA,我是一名Java开发人员 . 我使用Play 2.3.7和IntelliJ 14.我调用了Pattern.ask,它返回一个Future对象,该对象具有来自Web服务调用的String . 通过控制台我可以发现我的演员能够接收请求并执行操作 . 我不知道如何解析它 . 我试图通过使用Await.result来阅读Future . 但是这个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 演员的回复?

2 回答

  • 2

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

    检查你的演员表到 Future<Object> . 它永远不会在运行时工作,并且稍后会检测到类型不兼容,因为Java 's future as nothing to do with Akka' s Awaitable .

  • 0

    我找到了一种解析演员回应的方法 . 创建一个函数,包装您的未来并将其映射到一个函数,该函数将检查响应的实例类型并返回Result . 以下是工作代码段 .

    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);
    

相关问题