2014-07-16 30 views
1

我有下面的代碼塊,稍微延遲調用兩個請求。Akka調度

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以及響應消息。我的意圖是延遲發送與actor2對應的REST請求。然而,我從日誌中觀察到的是,請求是從兩個參與者立即發送的,並且只有響應處理(兩個期貨之間)延遲了10秒。這是Akka調度程序的預期行爲嗎?如果我想在上述情況下延遲兩個參與者之間的請求啓動,我可以使用Thread.sleep嗎? (我讀過的地方不建議在akka actor中使用Thread.sleep)。欣賞投入。

回答

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!") } 
    } 
) 

快樂的徒步旅行!

相關問題