我正在使用Scala AKKA HTTP和AKKA Actor来实现RESTful服务。
由于请求超时,我正面临一个问题,正在等待Actor的响应。我知道参与者应该始终向sender()发送消息/响应。
同步POST请求正在等待响应,直到达到默认请求超时期限(根据Timeouts而言,默认请求超时为20秒)。
响应已返回给客户端,但Actor继续执行。 60秒后(我已定义的超时值),将返回AskTimeOutException。但是演员执行会在那之后继续执行请求(如果我错了,请纠正我)。
如何处理这种情况? 返回请求超时时,有什么方法可以停止/重启actor?还是应该保护我的代码以防止任何阻塞情况?
MyActor.scala
object MyActor
{
def props(): Props = Props(classOf[MyActor])
def propsWithSmallestMailboxPool(nrOfInstances: Int = 3): Props =
props().withRouter(SmallestMailboxPool(nrOfInstances = nrOfInstances))
sealed abstract trait Request
final case class AddEntity(entity: Entity) extends Request
sealed abstract trait Response
final case class EntityCreated(entity: Entity) extends Response
}
class MyActor extends Actor with ActorLogging {
override def receive = {
case request: Request =>
request match {
case AddEntity(entity) =>
sender() ! addEntity(entity)
}
}
}
Route.scala
implicit def exceptionHandler: ExceptionHandler = routesExceptionHandler
lazy val myActor: ActorRef = system.actorOf(MyActor.propsWithSmallestMailboxPool())
val entityRoute: Route = {
path("entity") {
post {
operationName("addEntity") {
entity(as[Entity]) { entity =>
onSuccess(myActor ? MyActor.AddEntity(entity)) {
case r: MyActor.EntityCreated =>
complete(StatusCodes.Created)
case Failure(ex) =>
complete(StatusCodes.InternalServerError)
}
}
}
}
}