我正在使用Play!編寫一個用Scala編寫的Web應用程序!框架和Akka。代碼基本上是這樣組織的:播放控制器向Akka演員發送消息。演員反過來與一個持久層交談,該層抽象數據庫訪問。在應用這些部件的使用的一個典型的例子:在CRUD Web應用程序中使用Akka actors
class OrderController(orderActor: ActorRef) extends Controller {
def showOrders(customerId: Long) = {
implicit request => Async {
val futureOrders = orderActor ? FindOrdersByCustomerId(id)
// Handle the result, showing the orders list to the user or showing an error message.
}
}
}
object OrderActor extends Actor {
def receive = {
case FindOrdersByCustomerId(id) =>
sender ! OrderRepository.findByCustomerId(id)
case InsertOrder(order) =>
sender ! OrderRepository.insert(order)
//Trigger some notification, like sending an email. Maybe calling another actor.
}
}
object OrderRepository {
def findByCustomerId(id: Long): Try[List[Order]] = ???
def insert(order: Order): Try[Long] = ???
}
正如你所看到的,這是基本的CRUD模式,就像你會在其他語言和框架看。查詢會傳遞到下面的圖層,並且當應用程序從數據庫中獲取結果時,該結果會返回到用戶界面。唯一相關的區別是使用actor和異步調用。
現在,我對演員的概念很陌生,所以我還沒有完全理解它。但是,從我讀過的,這不是演員應該如何使用。但是,請注意,在某些情況下(例如,在插入訂單時發送電子郵件),我們確實需要真正的異步消息傳遞。
所以,我的問題是:以這種方式使用演員是一個好主意嗎?利用Futures和Akka的其他併發功能,在Scala中編寫CRUD應用程序有哪些選擇?
看看鍵入的頻道 - 他們出來後,你張貼這個。他們有一些有趣的消息流特性,所以你可以做一些事情,比如通過幾個角色傳遞消息:OrderRepository.insert(order) - ! - > sender - ? - > sendEmail - ? - > displayResult。 –