Планирование Akka

1

У меня есть следующий блок кода, который вызывает несколько запросов с небольшой задержкой.

    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). Оцените ввод.

Теги:
akka
scheduled-tasks

1 ответ

2
Лучший ответ

Шаблон 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!

Ещё вопросы

Сообщество Overcoder
Наверх
Меню