我有以下代码块,它会稍微延迟调用两个请求。
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)。欣赏投入。
答案 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!") }
}
)
快乐的交易!