У меня есть следующий блок кода, который вызывает несколько запросов с небольшой задержкой.
final ActorRef actor1 = getContext().actorOf(
ActorClass.props(context,
"actor1");
futures.add(ask(actor1 , msg1, t));
final ActorRef actor2 = getContext().actorOf(
ActorClass.props(context,
"actor2");
futures.add(Patterns.after(Duration.create(10000, TimeUnit.MILLISECONDS),
getContext().system().scheduler() ,
getContext().dispatcher(), ask(actor2,msg2,t)));
В actor1 и actor2 я вызываю запрос REST, который возвращает cookie вместе с ответным сообщением. Мое намерение здесь - отложить отправку запроса REST, соответствующего actor2. Однако то, что я наблюдал из журналов, заключается в том, что запрос отправляется сразу от обоих участников, и только обработка ответа (между двумя фьючерсами) задерживается на 10 секунд. Является ли это планируемым поведением планировщика в Акке? Если я хочу отложить начало запроса между двумя участниками в приведенном выше случае, могу ли я использовать Thread.sleep? (Я где-то читал, что не рекомендуется использовать Thread.sleep внутри аккера akka). Оцените ввод.
Шаблон after(..., Future<T>)
имеет разную семантику, чем вы предполагаете.
Эта версия шаблона after
начнет действовать сразу же и задержит завершение будущего, полученного от этого метода. Если вы, однако, хотите отложить запуск, вам нужно использовать after(..., Callable<Future<T>>)
. Другими словами, сравните эти два метода:
// example code in Scala, but uses Java API
// future executes ASAP
print("Hello ")
Patterns.after(1.second, sys.scheduler, sys.dispatcher, Future { println("World!") })
// future executes after 1 second
print("Hello ")
Patterns.after(1.second, sys.scheduler, sys.dispatcher,
new Callable[Future[Unit]] {
override def call() = Future { println("World!") }
}
)
Счастливый hakking!