玩!如果从actor调用Web服务但不从控制器调用Web服务

时间:2014-05-18 06:00:35

标签: web-services playframework-2.0

在游戏中! 2.2.3应用程序,我需要查询Web服务,检索Json响应并以不同方式处理它们(存储在db中,发送电子邮件,...)。 我有一个静态方法的特定类,我使用WS API连接到Web服务。每当我从 Actor 调用此静态方法来从Web服务获取数据时,它就可以正常工作。但是,当我从 Controller 调用该方法时,我得到一个运行时超时异常。

基本上,静态方法如下:

public static JsonNode test2() {
    String searchURL = "https://api.angel.co/1/search";
    Promise<WS.Response> promise = WS.url(searchURL)
        .setQueryParameter("query", "medicast")
        .setQueryParameter("type", "Startup")
        .get();

    Promise<JsonNode> promisedJsonNode = promise.map(
        new Function<WS.Response, JsonNode>() {
            public JsonNode apply(WS.Response response) {
                return response.asJson();
            }
        }
    );
    JsonNode angelResp = promisedJsonNode.get();
    return angelResp;       
}

我意识到我可以使用 async 直接从 Controller 调用Web服务,但这只适用于返回 Result 而不是 > JsonNode 。鉴于 Controller 中方法的相对复杂性;我真的很想保持在其他地方调用Web服务的逻辑,只需调用外部静态方法来获取我需要的Json。任何帮助非常感谢。

1 个答案:

答案 0 :(得分:0)

您正试图立即获得Promise<JsonNode>的结果。 Promise的全部意义在于他们立即完成,他们最终完成

您需要从Promise<JsonNode>返回test2()。然后,让调用者使用map,flatMap等处理该promise,并返回自己的Promise。