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

时间:2015-06-16 10:26:20

标签: java akka

我是新玩框架和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 个答案:

答案 0 :(得分:2)

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

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

答案 1 :(得分: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);