【问题标题】:Akka schedulingAkka 调度
【发布时间】:2014-07-16 05:42:17
【问题描述】:

我有以下代码块,它会稍微延迟调用两个请求。

    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 演员中使用 Thread.sleep)。欣赏输入。

【问题讨论】:

    标签: java scheduled-tasks akka


    【解决方案1】:

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

    哈克快乐!

    【讨论】:

      猜你喜欢
      • 2019-10-27
      • 2016-12-26
      • 1970-01-01
      • 1970-01-01
      • 2014-09-04
      • 2015-04-04
      • 1970-01-01
      • 1970-01-01
      • 2019-07-27
      相关资源
      最近更新 更多