2013-09-30 22 views
0

最近,我們開始使用play 2.2。之前我們正在玩2.1.3。 在play 2.2它說Akka.future和異步方法被視爲已棄用。另外,當我們試圖通過循環運行下面的代碼片段fetchSample()時,需要更多時間才能完成play 2.2播放幀的工作2.2如何併發執行

那麼我們如何才能用最新的代碼替換下面的棄用代碼呢?

private static Promise<SampleDBResponseBean> fetchSample(
     final Document sampleDoc) throws Exception { 

    Promise<SampleBean> promiseOfSampleJson = Akka.future(

    new Callable<SampleBean>() { 

     public SampleBean call() throws Exception 

     { 
      return doSomeCalc(sampleDoc); 
     } 
    }); 
} 

private Result getAsyncResult(final SampleResponseBean sampleDbResponseBean) { 

    List<F.Promise<? extends SampleDBResponseBean>> promiseList = sampleDbResponseBean 
      .getSampleHelperList(); 

    Promise<List<SampleDBResponseBean>> promiseJsonObjLists = Promise 
      .sequence(promiseList); 

    return async(

    promiseJsonObjLists.map(

    new Function<List<SampleDBResponseBean>, Result>() { 

     public Result apply(List<SampleDBResponseBean> sampleList) { 

      SampleResponseBean sampleResponseBean = new SampleResponseBean(); 

      sampleResponseBean.setStatus("success"); 

      sampleResponseBean.setSampleList(sampleList); 

      JsonNode jsNodeResponse = Json.toJson(sampleResponseBean); 

      return ok(jsNodeResponse); 
     } 
    })); 
} 

我搜查了很多地方沒有看到任何解決方案。與2.1.3比較時,問題會影響我們的代碼性能。

任何想法如何在play 2.2中實現上述2種方法的棄用方法?

回答

1

由於在遷移文檔中指出:

http://www.playframework.com/documentation/2.2.x/Migration22

你想用Promise.promise。這也是文檔中描述:

http://www.playframework.com/documentation/2.2.x/JavaAsync

當然在API文檔:

http://www.playframework.com/documentation/2.2.x/api/java/play/libs/F.Promise.html#promise(play.libs.F.Function0)

一個關於遊戲2.2的Java承諾的非常好的事情,現在你可以控制確切地說,代碼運行在哪個執行上下文中,因此您可以創建自己的執行上下文,或者從Akka獲得一個執行上下文,並且可以同時控制多少個併發數據庫操作在整個應用程序中同時運行。

+0

嗨,感謝您的回覆。但我的疑問是http://www.playframework.com/documentation/2.2.x/Migration22他們仍然在描述有關Akka.future事件,儘管它不推薦使用,所以我們可以在哪裏獲得Promise.promise的示例代碼?我的要求是我有一個循環,每次從循環做一些計算。每次計算都需要一些時間。所以我需要同時執行計算。如果你正在爲此分享任何樣本代碼,這將對我們有很大幫助。謝謝 – KingDileep

+0

嗨,James,我們可以運行concurent執行,示例代碼如下給出下面的方法是從一個循環調用並執行同時在遊戲2.2 ....公開承諾 getRandom(){ \t \t無極隨機= Promise.promise(新Function0 (){ \t \t \t公共雙人適用(){ \t \t \t \t的System.out .println(「apply」); \t \t \t \t t ry { \t \t \t \t \t主題。睡眠(5000); \t \t \t \t}趕上(InterruptedException的發送){ \t \t \t \t \t // TODO自動生成的catch程序塊 \t \t \t \t \t e.printStackTrace(); \t \t \t \t} \t \t \t \t返回的Math.random(); \t \t \t} \t \t}); \t \t return random; \t} – KingDileep