【发布时间】:2013-05-13 14:11:14
【问题描述】:
在 Java 中,我可以使用 Scheduled Executor 来安排任务在给定延迟后运行。我可以在 Scala 中使用它,但我想知道是否有 Scala API 用于此。
是否有任何 Scala API(相对于 Java 中的 Scheduled Executor)来安排任务?
【问题讨论】:
标签: scala scheduled-tasks
在 Java 中,我可以使用 Scheduled Executor 来安排任务在给定延迟后运行。我可以在 Scala 中使用它,但我想知道是否有 Scala API 用于此。
是否有任何 Scala API(相对于 Java 中的 Scheduled Executor)来安排任务?
【问题讨论】:
标签: scala scheduled-tasks
作为替代方案,还有 Monix 调度程序: https://monix.io/docs/3x/execution/scheduler.html
它在后面使用了一个Java的Scheduled Executor,但是它是被包裹的并且是透明的。
你需要实现一些Runnable来执行,比Akka的Actor轻。
例如,您可以这样做(取自文档):
lazy val scheduler =
Scheduler.singleThread(name="my-thread")
// First execution in 3 seconds, then every 5 seconds
val c = scheduler.scheduleAtFixedRate(
3, 5, TimeUnit.SECONDS,
new Runnable {
def run(): Unit = {
println("Fixed delay task")
}
})
// If we change our mind and want to cancel
c.cancel()
【讨论】:
你可以使用scalaz的Task,
import scala.concurrent.duration.{FiniteDuration, SECONDS}
import scalaz.concurrent.Task
Task.schedule(Console.println("time's up"), FiniteDuration(5, SECONDS)).runAsync { _ => }
【讨论】:
我也一直在寻找用于计划执行的 scala api。
Java 的 ScheduledExecutor:
我为单个任务调度编写了一个小的 scala 包装器。见要点: https://gist.github.com/platy/8f0e634c64d9fb54559c
【讨论】:
Akka 与调度器有一些相似之处:
http://doc.akka.io/api/akka/2.1.4/#akka.actor.Scheduler
你可以从actor系统中获取一个:
val actorSystem = ActorSystem()
val scheduler = actorSystem.scheduler
val task = new Runnable { def run() { log.info("Hello") } }
implicit val executor = actorSystem.dispatcher
scheduler.schedule(
initialDelay = Duration(5, TimeUnit.SECONDS),
interval = Duration(10, TimeUnit.SECONDS),
runnable = task)
如果您使用的是 Akka 或基于它的东西,例如 Play,那将是正确的选择。
【讨论】:
println 函数。我是否需要做其他事情才能使其适用于任何其他功能(特别是同一类的方法)。
Action.async 类型的类方法。真的不知道原因,但它在项目的另一层对我有用。