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

io.atlassian.aws.swf.activities.LoopingActivity.scala Maven / Gradle / Ivy

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

import argonaut.Argonaut._
import argonaut.CodecJson
import Decision.{ StartTimer, FailWorkflowExecution }
import WorkflowEvent.{ ActivityScheduled, TimerStarted }

import scala.concurrent.duration.FiniteDuration

import scalaz.syntax.std.option._

case class LoopingActivity(activity: Activity, input: Option[String], maxRetry: Int, delay: FiniteDuration, retryCount: Int = 0)

object LoopingActivity {
  import JsonCodecs._, Workflows._

  implicit val delayedTaskParametersCodecJson: CodecJson[LoopingActivity] =
    casecodec5(LoopingActivity.apply, LoopingActivity.unapply)("activity", "input", "max-retry", "delay", "retry-count")

  def startLoopedActivity(timerInfo: TimerStarted): List[Decision] =
    (for {
      control <- timerInfo.control
      params <- control.decodeOption[LoopingActivity]
    } yield {
      scheduleActivity(params.activity, params.input, timerInfo.control)
    }) | FailWorkflowExecution("Invalid state of timer event", s"Unable to decode control for $timerInfo").list

  def scheduleNextLoop(lastScheduled: ActivityScheduled.Details): List[Decision] =
    (for {
      controlString <- lastScheduled.control
      taskParams <- controlString.decodeOption[LoopingActivity]
    } yield {
      if (taskParams.retryCount < taskParams.maxRetry)
        startLoop(taskParams.copy(retryCount = taskParams.retryCount + 1))
      else
        FailWorkflowExecution(s"Looped activity failed to complete after ${taskParams.maxRetry} attempts", s"Activity ${taskParams.activity} with Id: ${lastScheduled.activityId}").list
    }) | FailWorkflowExecution(s"Invalid state of scheduled activity event ${lastScheduled.activityId}", s"Unable to decode control for $lastScheduled").list

  def startLoop(parameters: LoopingActivity): List[Decision] =
    StartTimer(TimerId(s"timer-${parameters.activity.name}-${java.util.UUID.randomUUID().toString}"),
      parameters.delay, parameters.jencode.nospaces.some).list
}





© 2015 - 2025 Weber Informatics LLC | Privacy Policy