我正在做一些使用噴霧的Http請求處理。對於一個請求,我啓動一個演員,並將有效載荷發送給演員進行處理,在演員完成有效載荷的工作後,我會對該演員致電context.stop(self)
來演員下臺。這個想法是爲了防止演員過飽和物理機器。從噴霧路線產生的演員困惑
這是我有事情設置..
在httphandler.scala
,我已成立的路線如下:
path("users"){
get{
requestContext => {
val userWorker = actorRefFactory.actorOf(Props(new UserWorker(userservice,requestContext)))
userWorker ! getusers //get user is a case object
}
}
} ~ path("users"){
post{
entity(as[UserInfo]){
requestContext => {
userInfo => {
val userWorker = actorRefFactory.actorOf(Props(new UserWorker(userservice,requestContext)))
userWorker ! userInfo
}
}
}
}
}
我UserWorker
演員的定義如下:
trait RouteServiceActor extends Actor{
implicit val system = context.system
import system.dispatcher
def processRequest[responseModel:ToResponseMarshaller](requestContex:RequestContext)(processFunc: => responseModel):Unit = {
Future{
processFunc
} onComplete {
case Success(result) => {
requestContext.complete(result)
}
case Failure(error) => requestContext.complete(error)
}
}
}
class UserWorker(userservice: UserServiceComponent#UserService,requestContext:RequestContext) extends RouteServiceActor{
def receive = {
case getusers => processRequest(requestContext){
userservice.getAllUsers
}
context.stop(self)
}
case userInfo:UserInfo => {
processRequest(requestContext){
userservice.createUser(userInfo)
}
context.stop(self)
}
}
我的第一個問題是,我是否以真正的異步方式處理請求?我的代碼有哪些缺陷?
我的第二個問題是requestContext.complete
是如何工作的?由於原始請求處理線程不再存在,因此requestContext
如何將計算結果發送回客戶端。
我的第三個問題是,因爲我在每個部分方法之後調用context.stop(self)
,是否有可能在處理不同消息的過程中終止工作人員。
我的意思是,雖然演員收到一條消息來處理getusers
,但同一個演員完成了UserInfo
的處理並終止了演員,然後才能到達「getusers」消息。我在每次請求時都會創建新的演員,但是有可能在封面下,actorRefFactory
提供了一個以前創建的演員的參考,而不是一個新演員?
我對所有的抽象都感到困惑,如果有人能爲我分解它,那將會很棒。
謝謝
除了原來的問題上@jrudolph已經回答了:如果你想返回從演員到HTTP用戶的一些結果,那麼你應該使用阿卡問模式: '(得到與路徑( 「用戶」)){ \t完整{(?userWorker getusers).mapTo [PutResultTypeHere]} }' 並在您的UserWorker中: 'case getusers => sender! processRequest(...)' –