参与者:处理请求超时

时间:2020-08-07 16:44:33

标签: scala akka actor akka-http

我正在使用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)  
          }
         }
        }
      }
    }

0 个答案:

没有答案