0
當談到Play的承諾時,我仍然有點失落。在Play documentation它說:什麼時候應該使用Promises?
默認配置調整異步控制器。換句話說,應用程序代碼應避免在控制器中阻塞,即讓控制器代碼等待操作。這種阻塞操作的常見示例是JDBC調用,流API,HTTP請求和長計算。
那麼我應該爲每個JDBC調用使用Promise嗎?這幾乎意味着在幾乎每一個行動中使用承諾,因爲它們以某種方式使用數據庫。對?
當談到Play的承諾時,我仍然有點失落。在Play documentation它說:什麼時候應該使用Promises?
默認配置調整異步控制器。換句話說,應用程序代碼應避免在控制器中阻塞,即讓控制器代碼等待操作。這種阻塞操作的常見示例是JDBC調用,流API,HTTP請求和長計算。
那麼我應該爲每個JDBC調用使用Promise嗎?這幾乎意味着在幾乎每一個行動中使用承諾,因爲它們以某種方式使用數據庫。對?
是的。承諾是非常有用的,有一個線程專用於你的控制器(它的重要性非常高)做「好」的工作:一項工作不昂貴和/或與控制器工作有關。
換句話說,綁定表單等,並管理承諾。但不做jdbc調用(鎖定發生得太快)。
例如在控制器類:
public static F.Promise<Result> doControllerWork() {
return F.Promise.promise(
() -> doBusinessWorkAndReturnSomething())
.map(
(returnedValue) -> ok(views...render(returnedValue))),
);
}
public static ReturnType doBusinessWorkAndReturnSomething(){
...
return something;
}
編輯1:
如果您有序列管理多個承諾:
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);
}
而且desining每個承諾所做的工作(非常)類似於多線程設計。
有趣。是什麼讓你說JDBC調用不應該放在Promise中?我在問,因爲Play文檔中有其他說明(https://www.playframework.com/documentation/2.3.x/JavaAsync)。我想知道一個任務可以成爲一個承諾。根據Play的文檔,JDBC調用已經足夠了。但這看起來對我來說太過矯枉過正。 – Kris
在線程控制器中:綁定表單等,並管理Promise。在其他線程中:jdbc調用,業務調用等。 –
由於存在阻塞和延遲的風險,這不會將jdbc調用放入承諾中矯枉過正。如果你在一個非常小的數據庫中有一個非常簡單的jdbc調用的情況,你可以在線程控制器中進行調用。以下是其他文檔[https://www.playframework.com/documentation/2.4.x/ThreadPools](https://www.playframework.com/documentation/2.4.x/ThreadPools) –