阿卡安排

时间:2014-07-16 05:42:18

标签: java scheduled-tasks 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中调度程序的预期行为吗?如果我想在上述情况下延迟两个actor之间的请求启动,我可以使用Thread.sleep吗? (我在某处读过,不建议在akka actor中使用Thread.sleep)。欣赏投入。

1 个答案:

答案 0 :(得分: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!") }
  }
)

快乐的交易!