2016-08-02 59 views
0

我的控制器中有一個函數,它接受用戶輸入,然後使用無限循環查詢數據庫並將從數據庫返回的對象發送到網頁。這一切都很好,除了我需要引入併發才能運行此邏輯並呈現網頁。使用Scala併發更改狀態

代碼爲:

def getSearchResult = Action { request => 
    val search = request.queryString.get("searchInput").head.head 

    val databaseSupport = new InteractWithDatabase(comm, db) 

    val put = Future { 
     while (true) { 
     val data = databaseSupport.getFromDatabase(search) 
     if (data.nonEmpty) { 
      if (data.head.vendorId.equals(search)) { 
      comm.communicator ! data.head 
      } 
     } 
     } 
    } 
    Ok(views.html.singleElement.render) 
    } 

產生的問題是,當我想再次調用此方法,但使用不同的輸入。因爲第一個線程處於無限循環中,所以它永遠不會停止運行,並且即使在我啓動第二個線程時也仍在運行。因此,兩個對象同時在兩個獨立的線程中被髮送到網頁。

一旦我再次調用此函數,我該如何停止第一個線程?或者,有沒有更好的實現這個想法,以便我可以不使用多線程呢?我試圖從這個函數中刪除併發(因爲多線程已經給我所有這些問題),而不是將它移動到Web套接字本身,但這提出了問題,因爲Web套接字連接到路由器,一切都通過路由器連接到網絡套接字。

+0

你試過'if(nomore)break'嗎? – Dima

回答

0

嘗試使用AsyncAction作爲結果返回Future [Result]。在這個結果的旁邊進行數據庫調用。例如(僞代碼),

def getSearchResult = AsyncAction { request => 
val search = request.queryString.get("searchInput").head.head 

val databaseSupport = new InteractWithDatabase(comm, db) 

Future { 
    val data = databaseSupport.getFromDatabase(search) 
    if (data.nonEmpty) { 
    if (data.head.vendorId.equals(search)) { 
     comm.communicator ! data.head // A 
    } 
    } 
    Ok(views.html.singleElement.render) 
} 

}

更好,如果databaseSupport.getFromDatabase(search)返回Future但這是另一個話題。棘手的部分是如何處理「A」處的Actor。請記住在退出時必須返回Future[Result]結果類型。