app/com/gu/contentapi/sanity/utils/QuartzScheduler.scala (53 lines of code) (raw):
package com.gu.contentapi.sanity.utils
import org.quartz.JobBuilder.newJob
import org.quartz.SimpleScheduleBuilder.simpleSchedule
import org.quartz.TriggerBuilder.newTrigger
import org.quartz.CronScheduleBuilder
import org.quartz.CronExpression
import org.quartz.impl.StdSchedulerFactory
import org.quartz.Scheduler
import org.quartz.Job
import org.quartz.JobExecutionContext
import scala.collection.concurrent.TrieMap
import scala.concurrent.duration.Duration
object QuartzScheduler {
private val scheduler = StdSchedulerFactory.getDefaultScheduler
def start() {scheduler.start()}
def stop() {
scheduler.clear()
scheduler.standby()
}
def schedule(name: String, g: => Unit): ScheduleHolder = {
val wrap: JobExecutionContext => Unit = x => g
scheduleWithContext(name, wrap)
}
def scheduleWithContext(name: String, f: JobExecutionContext => Unit): ScheduleHolder = {
new ScheduleHolder(name, f, scheduler)
}
}
class ScheduleHolder (name: String, f: JobExecutionContext => Unit, scheduler: Scheduler) {
def at(cronPattern: String) {
ScheduleHolder.add(name, f)
val job = newJob(classOf[GenJob]).withIdentity(name).build()
val trigger = newTrigger().withSchedule(CronScheduleBuilder.cronSchedule(new CronExpression(cronPattern))).build()
scheduler.scheduleJob(job, trigger)
}
def every(interval: Duration) {
ScheduleHolder.add(name, f)
val job = newJob(classOf[GenJob]).withIdentity(name).build()
val trigger = newTrigger().withSchedule(simpleSchedule().withIntervalInMilliseconds(interval.toMillis).repeatForever()).build()
scheduler.scheduleJob(job, trigger)
}
}
object ScheduleHolder {
type JobFunc = JobExecutionContext => Unit
private val jobs = new TrieMap[String, JobFunc]
def add(name: String, job: JobFunc) {jobs.put(name, job)}
def get(name: String):Option[JobFunc] = {jobs.get(name)}
}
class GenJob extends Job {
def execute(ctx: JobExecutionContext): Unit = {
val name = ctx.getJobDetail.getKey.getName
ScheduleHolder.get(name).foreach(f => f(ctx))
}
}