3

这是我之前的问题的后续行动:

假设我有一个演员,它X每秒处理请求。但是,有时会出现突发事件,并且客户端Y > X每秒发送请求。现在我必须保证客户端在给定的超时时间内收到响应(以太成功超时状态)。

假设我使用 Scala 和 Akka,你会如何建议实现它?

4

2 回答 2

3

首先,一个显示超时处理的小代码示例:

import akka.actor._
import akka.util.Timeout
import scala.concurrent.duration._
import akka.pattern._
import scala.util._
import java.util.concurrent.TimeoutException

object TimeoutTest {
  def main(args: Array[String]) {
    val sys = ActorSystem("test-system")
    implicit val timeout = Timeout(2 seconds)
    implicit val ec = sys.dispatcher
    val ref = sys.actorOf(Props[MyTestActor])

    val fut = ref ? "foo"
    fut onComplete{
      case Success(value) => println("Got success")
      case Failure(ex:TimeoutException) => println("Timed out")
      case Failure(ex) => println("Got other exception: " + ex.getMessage)
    }
  }
}

class MyTestActor extends Actor{
  def receive = {
    case _ =>
      Thread.sleep(3000)
      sender ! "bar"
  }
}

您可以在此示例中看到,我指定了ask2 秒的超时时间,并且我的演员在响应前 3 秒处于休眠状态。在这种情况下,我总是会得到Failure包装 a TimeoutException。现在,超时处理不是 ScalaFuture类的原生功能,但幸运的是,Akka 为其ask操作添加了超时支持。在幕后,当你执行一个 时ask,Akka 会创建两个Promises;一个可以由响应消息的参与者完成,另一个由HashedWheelTimer类中的计时器任务完成。然后,AkkaFutures从这两个Promise实例中获取 并将它们组合成一个,Future.firstCompletedOf这样Future你就可以从?调用可以通过接收消息的参与者的响应或超时来完成,无论先发生什么。

于 2013-04-27T18:15:24.897 回答
1

这取决于你如何使用演员。如果您使用“询问”(如 中actor ? msg),您会收到一个在指定时间后超时的未来。

请参阅http://doc.akka.io/docs/akka/snapshot/scala/futures.html(与演员一起使用)

你可以在未来添加一个 onFailure 钩子,如果未来超时,你可以向客户端发送错误响应。

未来的 api:http ://www.scala-lang.org/api/current/index.html#scala.concurrent.Future

于 2013-04-27T17:26:55.147 回答