Uba*_*dah 7 java reactive-programming playframework
我有一个控制器动作,我需要调用第三方Web服务.
我的问题是我没有打电话给一个网络服务.我需要链接4到5个Web服务.我调用的每个Web服务都返回一个我需要处理的JSON对象,并根据一些逻辑决定调用另一个Web服务(来自4个Web服务)或者向调用者返回响应.这是我想要做的:
public static Promise<Result> accounts(){
return WS.url("url1").get().map(response1 -> {
JsonNode mynode = response1.asJson();
if (mynode.get("status").asInt()==200){
Promise<JsonNode> jsonPromise = WS.url("url2").get().map(response2->{
return response2.asJson();
});
}
return ok(mynode);
});
}
Run Code Online (Sandbox Code Playgroud)
现在,从文档中,我认为我需要的是链接每个Web服务调用是承诺的承诺.但我不知道该怎么做?
谢谢
他们称之为Reactive Composition,就像这样 - >
public static Promise<Result> reactiveCombo() {
Promise<WSResponse> promise1 = WS.url("url1").get();
Promise<WSResponse> promise2 = WS.url("url2").get();
Promise<WSResponse> promise3 = WS.url("url3").get();
return promise1.flatMap(response1 -> {
final JsonNode json1 = response1.asJson();
if (!json1.has("someField")) {
return Promise.promise(() -> badRequest());
}
return promise2.flatMap(response2 -> {
final JsonNode json2 = response2.asJson();
if (json1.get("someField").asText().equals(json2.get("someField").asText())) {
return Promise.promise(() -> badRequest());
}
return promise3.map(response3 -> {
final JsonNode json3 = response3.asJson();
if (json3.get("boolField").asBoolean()) {
return badRequest();
}
return ok();
});
});
});
}
Run Code Online (Sandbox Code Playgroud)
对于大量的通话,您可以使用Promise.sequence()并获得"创意":
private static Promise<JsonNode> getPromise(String url, Predicate<JsonNode> predicate) {
return WS.url(url).get().map(response -> {
JsonNode json = response.asJson();
if (predicate.negate().test(json)) {
throw new Exception("BUMMER!");
}
return json;
});
}
public static Promise<Result> reactiveCombo(List<String> urls) {
List<Promise<JsonNode>> promises = new ArrayList<Promise<JsonNode>>(urls.size());
Predicate<String> predURL = p -> p.contains("goodApi");
Predicate<JsonNode> pred1 = p -> p.has("boolField") && p.get("boolField").asBoolean();
Predicate<JsonNode> pred2 = p -> p.has("someField");
urls.forEach(url -> {
Promise<JsonNode> promise = predURL.test(url) ? getPromise(url, pred1) : getPromise(url, pred2);
promises.add(promise);
});
return Promise.sequence(promises).map(results -> ok()).recover(t -> badRequest());
}
Run Code Online (Sandbox Code Playgroud)
其他细节+ docudrama:
对Java 8和Play Framework保持反应(旧的但仍然具有教育意义)
| 归档时间: |
|
| 查看次数: |
3303 次 |
| 最近记录: |