Роль TimeOut и время перешли на Await.result - PullRequest
0 голосов
/ 20 мая 2018

У меня есть служба akka actor, работающая на 127.0.0.1:2552.

Я пытаюсь получить к ней доступ от клиента, например:

val client = new SClient("127.0.0.1:2552")
describe("akkaDbClient") {
it("should set a value"){
  client.set("123", new Integer(123))
  val futureResult = client.get("123")
  val result = Await.result(futureResult, 10 seconds)
  result should equal(123)
 }
}

class SClient(remoteAddress: String){
private implicit val timeout = Timeout(2000)
private implicit val system = ActorSystem("LocalSystem")
private val remoteDb = 
   system.actorSelection(s"akka.tcp://akkadb@$remoteAddress/user/akka-db")

def set(key: String, value: Object) = {
 remoteDb ? SetRequest(key, value)
}

def get(key: String) = {
  remoteDb ? GetRequest(key)
 }
}

Я не могупонять роль TimeOut и аргумента времени, передаваемого Await.result ().

Что означают эти значения и как они влияют на программу?

1 Ответ

0 голосов
/ 20 мая 2018

Будущее выполняется в фоновом режиме, а не в основном потоке.Возможно, если есть большие вычисления, это займет очень много времени.Или хуже, если есть бесконечный цикл и будущее никогда не возвращается.

Это не проблема (в прагматическом смысле), пока вы не дождетесь его завершения.Это блокирует выполнение так же, как и обычный бесконечный цикл.Таким образом, вы можете указать тайм-аут на то, как долго вы намерены ждать результата, прежде чем он остановится, с помощью TimeoutException.

Если client.get(123) занимает больше 10 секунд, вы получите исключение, и тест не пройдёт,В противном случае он никогда не вернется и не запустится, пока вы не убьете процесс вручную.

Подробнее о Futures

Относительно второго тайм-аута: вы спрашиваете своего актера о будущем свозможный ответ.Это также может привести к тайм-ауту.

В вашем конкретном примере тайм-аут произойдет, если ваш актер займет больше двух секунд.Но если вы, например, отобразите, отобразите, отфильтруете будущее, а затем вернете его, эти операции прекратят работу через десять секунд.

implicit val timeout = Timeout(2000)

val f1 = actor ? message // timout of 2 seconds
val f2 = f1 map longRunningOperation

Await.result(f2, 10 seconds) // timeout of 10 seconds
...