【问题标题】:Scheduling asynchronous tasks in Java Play 2.4.2: scala Duration compilation error在 Java Play 2.4.2 中调度异步任务:scala Duration 编译错误
【发布时间】:2015-10-14 10:44:57
【问题描述】:

我在 Play 2.4.2 中使用 Akka 系统调度程序来执行异步任务。文档说使用scala.concurrent.duration.Duration 类来创建一个时间单位,但我收到一个编译错误,说我无法创建Duration 的实例,因为它是一个抽象类。

这是我要异步执行的代码块:

Akka.system().scheduler().scheduleOnce(NO_DELAY, workerHandler, Akka.system().dispatcher());

NO_DELAY 是这样定义的:

private static final Duration NO_DELAY = new Duration.create(0, "seconds");

以及相关的导入语句:

import scala.concurrent.duration.*;
import java.util.concurrent.TimeUnit;

错误信息:

scala.concurrent.duration.Duration is abstract; cannot be instantiated
[error] new Duration(0, "seconds")

知道如何正确使用Duration吗?

【问题讨论】:

    标签: java scala playframework-2.0 akka


    【解决方案1】:

    你不能实例化Duration,因为它是一个抽象类,所以你需要去掉new关键字。

    因此,您可以这样做:

    import scala.concurrent.duration.Duration;
    
    private static final Duration NO_DELAY = Duration.create(0, TimeUnit.SECONDS);
    

    甚至:

    private static final Duration NO_DELAY = Duration.Zero();
    

    【讨论】:

    • 好像找不到FiniteDuration:cannot find symbol [error] symbol: class FiniteDuration [error] location: package akka.util
    • 没错,它是在旧版本中。我更新了我的答案。它解决了你的问题吗? :)
    • 如果这些都没有帮助,请告诉我。
    • 我在下面发布了我的解决方案 - 感谢您的所有帮助!看起来 Scala 2.11.6 中的情况发生了重大变化。
    【解决方案2】:

    看起来自从升级到 Scala 2.11.6 以来,FiniteDuration 是一个类并且可以被实例化。 Duration 抽象类不再存在create 方法。我改用这个解决了我的问题:

     private static final FiniteDuration NO_DELAY = new FiniteDuration(0, TimeUnit.SECONDS);
     private static final FiniteDuration FREQUENCY = new FiniteDuration(2, TimeUnit.SECONDS);
    

    import 语句没有变化。

    【讨论】:

      猜你喜欢
      • 2012-11-08
      • 2015-10-19
      • 2013-03-04
      • 2012-08-08
      • 2021-10-10
      • 2016-03-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多