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

io.atlassian.aws.swf.akka.Decider.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.{ Props, Actor, PoisonPill }
import com.amazonaws.services.simpleworkflow.AmazonSimpleWorkflow
import kadai.log.json.JsonLogging
import SWFAction._

import scala.concurrent.duration._

case class DeciderConfig(pollDelay: FiniteDuration = 2.seconds,
                         workflow: WorkflowDefinition,
                         identity: SWFIdentity)

object Decider {
  object Protocol {
    case object Poll
  }

  def props(config: DeciderConfig, swf: AmazonSimpleWorkflow): Props =
    Props(classOf[Decider], config, swf)
}

class Decider(config: DeciderConfig, swf: AmazonSimpleWorkflow) extends Actor with JsonLogging {
  import context.dispatcher
  import io.atlassian.aws.swf.akka.Decider.Protocol._
  import kadai.log.json.JsonLogging._

  def receive = {
    case PoisonPill =>
      context.stop(self)
    case Poll =>
      poll.flatMap { od =>
        od.fold(Attempt.ok(())) { d =>
          complete(d.taskToken, "", config.workflow.decisionEngine(d))
        }
      }.run.fold(
        { i => error(i) },
        { identity }
      )
      triggerPoll
      ()
    case m =>
      println(s"Unknown message $m")
      triggerPoll
      ()
  }

  private def poll: Attempt[Option[DecisionInstance]] =
    SWF.poll(DecisionQuery(config.workflow.domain, config.workflow.workflowConfig.defaultTaskList, config.identity)).unsafePerform(swf)

  private def complete(taskToken: TaskToken, context: String, decisions: List[Decision]): Attempt[Unit] =
    SWF.completeDecision(taskToken, context, decisions).unsafePerform(swf)

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




© 2015 - 2025 Weber Informatics LLC | Privacy Policy