2016-08-02 56 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]结果类型。