2015-06-16 21 views
1

我是新來玩框架和AKKA,我是一個Java開發人員。我使用Play 2.3.7和IntelliJ 14.我調用了Pattern.ask,並返回一個Future對象,它具有來自Web服務調用的字符串。通過控制檯,我可以發現我的演員能夠接收請求並執行操作。我不知道如何解析它。我正嘗試通過使用Await.result來讀取未來。但是,這個等待結果期待等待的對象。如果我傳遞Future對象,它會引發編譯器異常。請幫忙。玩Java Akka - 等待.result期待等待的對象,不接受未來<Object>

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

究竟是什麼樣的編譯器異常?因爲如果它是「類型不匹配」,您只需將'Await.result'值轉換爲類似的字符串即可。 'String msg1 =(String)Await.result(...)'。 – m4ktub

+0

我收到了一個類似於 - 期待的等待的錯誤,但在Await.result的aruement {1}處發現了scala.concurrent.Future – dhana

回答

0

您必須小心標準java類型和Akka類型之間的名稱衝突。例如,Java有java.util.concurrent.Future類型,而Akka的Patterns.ask()返回akka.dispatch.Future

檢查您的演員陣容爲Future<Object>。它在運行時永遠不會工作,並且類型不兼容性被稍後檢測到,因爲Java的未來與Akka的Awaitable無關。

0

我找到了一種方法來解析從演員回來的迴應。創建一個函數,包裝你的未來並將其映射到一個函數,該函數將檢查響應的實例類型並返回結果。以下是工作代碼片段。

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