我是新玩框架和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
演员的回复吗?
答案 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);