2015-05-23 217 views
0

當談到Play的承諾時,我仍然有點失落。在Play documentation它說:什麼時候應該使用Promises?

默認配置調整異步控制器。換句話說,應用程序代碼應避免在控制器中阻塞,即讓控制器代碼等待操作。這種阻塞操作的常見示例是JDBC調用,流API,HTTP請求和長計算。

那麼我應該爲每個JDBC調用使用Promise嗎?這幾乎意味着在幾乎每一個行動中使用承諾,因爲它們以某種方式使用數據庫。對?

回答

0

是的。承諾是非常有用的,有一個線程專用於你的控制器(它的重要性非常高)做「好」的工作:一項工作不昂貴和/或與控制器工作有關。

換句話說,綁定表單等,並管理承諾。但不做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每個承諾所做的工作(非常)類似於多線程設計。

+0

有趣。是什麼讓你說JDBC調用不應該放在Promise中?我在問,因爲Play文檔中有其他說明(https://www.playframework.com/documentation/2.3.x/JavaAsync)。我想知道一個任務可以成爲一個承諾。根據Play的文檔,JDBC調用已經足夠了。但這看起來對我來說太過矯枉過正。 – Kris

+0

在線程控制器中:綁定表單等,並管理Promise。在其他線程中:jdbc調用,業務調用等。 –

+1

由於存在阻塞和延遲的風險,這不會將jdbc調用放入承諾中矯枉過正。如果你在一個非常小的數據庫中有一個非常簡單的jdbc調用的情況,你可以在線程控制器中進行調用。以下是其他文檔[https://www.playframework.com/documentation/2.4.x/ThreadPools](https://www.playframework.com/documentation/2.4.x/ThreadPools) –

相關問題