-
Notifications
You must be signed in to change notification settings - Fork 1
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
- Loading branch information
Yildirim Adiguzel
committed
Mar 23, 2017
1 parent
4581943
commit f89e5f9
Showing
11 changed files
with
249 additions
and
5 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,12 @@ | ||
package io.cronit.actors | ||
|
||
import akka.actor.Actor | ||
import io.cronit.models.Start | ||
|
||
class RestTaskActor extends Actor { | ||
override def receive: Receive = { | ||
case Start => { | ||
|
||
} | ||
} | ||
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,9 @@ | ||
package io.cronit.models | ||
|
||
case class Acked() | ||
|
||
case class NotAcked() | ||
|
||
case class Start() | ||
|
||
case class Finish() |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -1,5 +1,5 @@ | ||
package io.cronit.models | ||
|
||
import java.util.Date | ||
import org.joda.time.DateTime | ||
|
||
case class ScheduleOnce(runAt: Date) extends ScheduleInfo | ||
case class ScheduleOnce(runAt: DateTime) extends ScheduleInfo |
15 changes: 15 additions & 0 deletions
15
src/main/scala/io/cronit/services/ActorSystemComponent.scala
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,15 @@ | ||
package io.cronit.services | ||
|
||
import akka.actor.{ActorSystem, Props} | ||
import io.cronit.actors.RestTaskActor | ||
|
||
|
||
trait ActorSystemComponent { | ||
val actorSystemService: ActorSystemService | ||
|
||
class ActorSystemService { | ||
implicit lazy val actorSystem = ActorSystem("CronitActorSystem") | ||
val scheduler = actorSystem.scheduler | ||
val restTaskActor = actorSystem.actorOf(Props[RestTaskActor]) | ||
} | ||
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
29 changes: 29 additions & 0 deletions
29
src/main/scala/io/cronit/services/JobSchedulerComponent.scala
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,29 @@ | ||
package io.cronit.services | ||
|
||
import io.cronit.models.{CronScheduler, JobModel, ScheduleOnce} | ||
import io.cronit.utils.Clock | ||
import org.joda.time.DateTime | ||
|
||
import scala.concurrent.ExecutionContext.Implicits.global | ||
|
||
trait JobSchedulerComponent { | ||
this: ActorSystemComponent with CronExpressionComponent => | ||
val jobSchedulerService: JobSchedulerService | ||
|
||
class JobSchedulerService { | ||
def scheduleTask(jobModel: JobModel): Unit = { | ||
var executionDate: DateTime = Clock.now() | ||
jobModel.scheduleInfo match { | ||
case cs: CronScheduler => { | ||
executionDate = cronExpressionService.getNextExecutionDate(cs.expression) | ||
} | ||
case so: ScheduleOnce => { | ||
executionDate = so.runAt | ||
} | ||
} | ||
val delay = cronExpressionService.getFiniteDurationFromNow(executionDate) | ||
actorSystemService.scheduler.scheduleOnce(delay, actorSystemService.restTaskActor, jobModel) | ||
} | ||
} | ||
|
||
} |
104 changes: 104 additions & 0 deletions
104
src/test/scala/io/cronit/builder/RestJobModelBuilder.scala
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,104 @@ | ||
package io.cronit.builder | ||
|
||
import io.cronit.models.{CronScheduler, RestJobModel, ScheduleInfo, ScheduleOnce} | ||
import io.cronit.utils.Clock | ||
|
||
class RestJobModelBuilder { | ||
|
||
var method: String = "" | ||
var url: String = "" | ||
var body: String = "" | ||
var expectedStatus: Int = 200 | ||
var headers: Map[String, String] = Map[String, String]() | ||
var name: String = "" | ||
var id: String = "" | ||
var scheduleInfo: ScheduleInfo = new ScheduleInfo {} | ||
|
||
def addHeader(key: String, value: String): RestJobModelBuilder = { | ||
headers + (key -> value) | ||
this | ||
} | ||
|
||
def method(method: String): RestJobModelBuilder = { | ||
this.method = method | ||
this | ||
} | ||
|
||
def url(url: String): RestJobModelBuilder = { | ||
this.url = url | ||
this | ||
} | ||
|
||
def scheduleInfo(scheduleInfo: ScheduleInfo): RestJobModelBuilder = { | ||
this.scheduleInfo = scheduleInfo | ||
this | ||
} | ||
|
||
def expectedStatus(expectedStatus: Int): RestJobModelBuilder = { | ||
this.expectedStatus = expectedStatus | ||
this | ||
} | ||
|
||
def name(name: String): RestJobModelBuilder = { | ||
this.name = name | ||
this | ||
} | ||
|
||
def body(body: String): RestJobModelBuilder = { | ||
this.body = body | ||
this | ||
} | ||
|
||
def id(id: String): RestJobModelBuilder = { | ||
this.id = id | ||
this | ||
} | ||
|
||
|
||
def build: RestJobModel = { | ||
val builder = this | ||
new RestJobModel { | ||
override def url = builder.url | ||
|
||
override def method = builder.method | ||
|
||
override def body = Some(builder.body) | ||
|
||
override def expectedStatus = builder.expectedStatus | ||
|
||
override def headers = Some(builder.headers) | ||
|
||
override def scheduleInfo = builder.scheduleInfo | ||
|
||
override def name = builder.name | ||
|
||
override def id = builder.id | ||
} | ||
} | ||
|
||
} | ||
|
||
object RestJobModelBuilder { | ||
def aRestJobModelBuilder(): RestJobModelBuilder = new RestJobModelBuilder() | ||
|
||
def sampleRestJobWithCronScheduler(): RestJobModel = RestJobModelBuilder. | ||
aRestJobModelBuilder(). | ||
method("GET"). | ||
url("http://www.google.com"). | ||
addHeader("foo", "bar"). | ||
name("CronJob"). | ||
expectedStatus(200). | ||
scheduleInfo(new CronScheduler("* * * * *")). | ||
build | ||
|
||
def sampleRestJobWithScheduleOnce(): RestJobModel = RestJobModelBuilder. | ||
aRestJobModelBuilder(). | ||
method("GET"). | ||
url("http://www.google.com"). | ||
addHeader("foo", "bar"). | ||
name("CronJob"). | ||
expectedStatus(200). | ||
scheduleInfo(new ScheduleOnce(Clock.now())). | ||
build | ||
|
||
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
51 changes: 51 additions & 0 deletions
51
src/test/scala/io/cronit/services/JobSchedulerServiceTest.scala
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,51 @@ | ||
package io.cronit.services | ||
|
||
import akka.actor.{ActorRef, Scheduler} | ||
import akka.testkit.TestProbe | ||
import io.cronit.builder.RestJobModelBuilder | ||
import io.cronit.utils.{Clock, DateUtils} | ||
import org.mockito.Mockito._ | ||
import org.scalatest.{FlatSpecLike, Matchers} | ||
import org.specs2.mock.Mockito | ||
|
||
import scala.concurrent.ExecutionContext.Implicits.global | ||
import scala.concurrent.duration._ | ||
|
||
class JobSchedulerServiceTest extends ActorSystemComponent with FlatSpecLike | ||
with Matchers | ||
with Mockito | ||
with JobSchedulerComponent | ||
with CronExpressionComponent { | ||
|
||
override val jobSchedulerService: JobSchedulerService = new JobSchedulerService | ||
override val cronExpressionService: CronExpressionService = mock[CronExpressionService] | ||
override val actorSystemService: ActorSystemService = new ActorSystemService { | ||
override val scheduler: Scheduler = mock[Scheduler] | ||
override val restTaskActor: ActorRef = TestProbe().ref | ||
} | ||
|
||
it should "calculate next execution delay when scheduling a task" in { | ||
Clock.freeze(DateUtils.toDate("20180202")) | ||
|
||
val restJob = RestJobModelBuilder.sampleRestJobWithCronScheduler | ||
when(cronExpressionService.getNextExecutionDate("* * * * *")).thenReturn(Clock.now) | ||
when(cronExpressionService.getFiniteDurationFromNow(Clock.now())).thenReturn(5 minutes) | ||
|
||
jobSchedulerService.scheduleTask(restJob) | ||
|
||
verify(actorSystemService.scheduler).scheduleOnce(5 minutes, actorSystemService.restTaskActor, restJob) | ||
Clock.unfreeze() | ||
} | ||
|
||
it should "calculate next execution delay when schedule once task" in { | ||
Clock.freeze(DateUtils.toDate("20180202")) | ||
|
||
val restJob = RestJobModelBuilder.sampleRestJobWithScheduleOnce | ||
when(cronExpressionService.getFiniteDurationFromNow(Clock.now())).thenReturn(15 minutes) | ||
|
||
jobSchedulerService.scheduleTask(restJob) | ||
|
||
verify(actorSystemService.scheduler).scheduleOnce(15 minutes, actorSystemService.restTaskActor, restJob) | ||
Clock.unfreeze() | ||
} | ||
} |