当谈到Play的承诺时,我仍然有点迷失。在Play documentation中它说:
默认配置针对异步控制器进行了调整。换句话说,应用程序代码应避免在控制器中阻塞,即使控制器代码等待操作。这种阻塞操作的常见示例是JDBC调用,流API,HTTP请求和长计算。
我应该为每个JDBC调用使用Promise吗?这几乎意味着在几乎每个动作中使用一个promise,因为它们都以某种方式使用数据库。正确?
答案 0 :(得分:0)
是。 Promise非常有用,可以让一个专用于你的控制器的线程(它的重要性非常高)做好了#34;好的"工作:工作并不昂贵和/或与控制器工作有关。
换句话说,绑定表格等,并管理Promises。但是没有做jdbc调用(锁发生得这么快)。
Controller类中的示例:
public static F.Promise<Result> doControllerWork() {
return F.Promise.promise(
() -> doBusinessWorkAndReturnSomething())
.map(
(returnedValue) -> ok(views...render(returnedValue))),
);
}
public static ReturnType doBusinessWorkAndReturnSomething(){
...
return something;
}
编辑1:
如果你必须按顺序管理几个Promise:
public static F.Promise<Result> doControllerWork() {
return F.Promise.sequence(
F.Promise.promise(() -> doSomething1()),
F.Promise.promise(() -> doSomething2()),
).map((returnList) -> {
ReturnType1 returnedElement1 = retrieveElement1(returnList);
ReturnType2 returnedElement2 = retrieveElement2(returnList);
return ok(views...(returnedElement1,returnedElement2));
});
}
public ReturnType1 retrieveElement1(List<Serializable> returnList){
int index = ...;
// find by type using instanceOf, etc..
return (ReturnType1) returnList.get(index);
}
在每个Promise中完成的工作与(非常)类似于多线程设计。