All Downloads are FREE. Search and download functionalities are using the official Maven repository.

io.atlassian.aws.swf.akka.ActivityPoller.scala Maven / Gradle / Ivy

There is a newer version: 8.0.3
Show newest version
package io.atlassian.aws
package swf
package akka

import _root_.akka.actor.{ Actor, PoisonPill, Props }
import _root_.akka.util.Timeout
import com.amazonaws.services.simpleworkflow.AmazonSimpleWorkflow
import kadai.log.json.JsonLogging

import scala.concurrent.duration._
import scalaz.concurrent.Task

case class ActivityPollerConfig(pollDelay: FiniteDuration = 2.seconds,
                                masterTimeout: FiniteDuration = 5.seconds,
                                domain: Domain,
                                identity: SWFIdentity)

object ActivityPoller {
  def props(swf: AmazonSimpleWorkflow, config: ActivityPollerConfig, taskList: TaskList, activities: List[ActivityDefinition[Task]]): Props =
    Props(classOf[ActivityPoller], swf, config, taskList, activities)

  object Protocol {
    case object Poll
  }
}

class ActivityPoller(swf: AmazonSimpleWorkflow,
                     config: ActivityPollerConfig,
                     taskList: TaskList,
                     activities: List[ActivityDefinition[Task]]) extends Actor with JsonLogging {

  import context.dispatcher
  import ActivityPoller.Protocol._
  import SWFAction._
  import kadai.Invalid.syntax._
  import kadai.log.json.JsonLogging._
  implicit val timeout = Timeout(config.masterTimeout)

  lazy val activityMap = activities.map { ad => ad.activity -> ad }.toMap

  def receive = {
    case PoisonPill =>
      context.stop(self)
    case Poll =>
      SWF.poll(ActivityQuery(taskList = taskList, identity = config.identity, domain = config.domain)).unsafePerform(swf).fold(
        { i => warn(i); triggerPoll },
        {
          case None => triggerPoll
          case Some(ai) =>
            val ad = activityMap(ai.activity)
            val newActor = context.actorOf(ActivityActor.props(swf, ad.definition, ai, ad.function))

            newActor ! ActivityActor.Protocol.Start
            triggerPoll
        }
      )
      ()
    case m =>
      warn(s"Unknown message $m, expect only Poll or PoisonPill".invalid)
      triggerPoll
      ()
  }

  private def triggerPoll =
    context.system.scheduler.scheduleOnce(config.pollDelay, self, Poll)
}




© 2015 - 2025 Weber Informatics LLC | Privacy Policy