2013-05-18 23 views
12

Trong Java, tôi có thể sử dụng Scheduled Executor để lên lịch các tác vụ chạy sau một thời gian trễ nhất định. Tôi có thể sử dụng nó ở Scala nhưng tôi tự hỏi liệu có một API Scala cho điều đó không.Người thực thi theo lịch trình tại Scala

Có API Scala nào (trái ngược với Scheduled Executor trong Java) để lên lịch các tác vụ không?

Trả lời

25

Akka có một cái gì đó tương tự với schedulers:

http://doc.akka.io/api/akka/2.1.4/#akka.actor.Scheduler

Bạn có thể lấy một từ hệ thống diễn viên:

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) 

Nếu bạn đang sử dụng Akka hoặc một cái gì đó dựa trên nó, như Play, đó sẽ là con đường để đi.

+4

Tại sao mọi người nghĩ Scala == Akka? –

4

Trước đây, một câu hỏi trùng lặp dẫn đến đồ chơi này.

scala> implicit class Expiry(val d: Deadline) extends AnyVal { 
    | def expiring(f: =>Unit) = 
    | future(Await.ready(Promise().future, d.timeLeft)) onComplete (_ => f) 
    | } 
defined class Expiry 

scala> val x = new SyncVar[Boolean]() 
x: scala.concurrent.SyncVar[Boolean] = [email protected] 

scala> 10 seconds fromNow expiring { 
    | println("That's all, folks.") 
    | x.put(true) 
    |  } 

scala> x.take() 
That's all, folks. 
res1: Boolean = true 
+0

Cảm ơn. Tương lai (Await.ready (Promise(). Future, d.timeLeft)) 'như là một thay thế cho' Thread.sleep', mà không lấy một chủ đề. – Michael

+9

Trên thực tế, được cảnh báo rằng nó ** không ** lấy một chủ đề (nó sẽ chặn một trong các chủ đề của nhóm chủ đề của ExecutionContext). –

+2

Tôi nên nói rằng nó là một đồ chơi ác. –

3

Tôi cũng đang tìm kiếm một scala api để thực hiện theo lịch biểu.

ScheduledExecutor Java:

  • sử dụng một hồ bơi thread để chạy lên lịch và vận hành timeout, và do đó không yêu cầu Chủ đề mỗi timeout
  • Không AKKA cần

Tôi đã viết một ít scala wrapper cho việc lập kế hoạch nhiệm vụ duy nhất. Xem các ý chính: https://gist.github.com/platy/8f0e634c64d9fb54559c

2

Bạn có thể sử dụng Task scalaz của,

import scala.concurrent.duration.{FiniteDuration, SECONDS} 
import scalaz.concurrent.Task 
Task.schedule(Console.println("time's up"), FiniteDuration(5, SECONDS)).runAsync { _ => }