Class DaprWorkflowContextImpl

java.lang.Object
io.dapr.workflows.DaprWorkflowContextImpl
All Implemented Interfaces:
WorkflowContext

public class DaprWorkflowContextImpl extends Object implements WorkflowContext
  • Constructor Details

    • DaprWorkflowContextImpl

      public DaprWorkflowContextImpl(com.microsoft.durabletask.TaskOrchestrationContext context) throws IllegalArgumentException
      Constructor for DaprWorkflowContextImpl.
      Parameters:
      context - TaskOrchestrationContext
      Throws:
      IllegalArgumentException - if context is null
    • DaprWorkflowContextImpl

      public DaprWorkflowContextImpl(com.microsoft.durabletask.TaskOrchestrationContext context, org.slf4j.Logger logger) throws IllegalArgumentException
      Constructor for DaprWorkflowContextImpl.
      Parameters:
      context - TaskOrchestrationContext
      logger - Logger
      Throws:
      IllegalArgumentException - if context or logger is null
    • DaprWorkflowContextImpl

      public DaprWorkflowContextImpl(com.microsoft.durabletask.TaskOrchestrationContext context, Saga saga) throws IllegalArgumentException
      Throws:
      IllegalArgumentException
    • DaprWorkflowContextImpl

      public DaprWorkflowContextImpl(com.microsoft.durabletask.TaskOrchestrationContext context, org.slf4j.Logger logger, Saga saga) throws IllegalArgumentException
      Constructor for DaprWorkflowContextImpl.
      Parameters:
      context - TaskOrchestrationContext
      logger - Logger
      saga - saga object, if null, saga is disabled
      Throws:
      IllegalArgumentException - if context or logger is null
  • Method Details

    • getLogger

      public org.slf4j.Logger getLogger()
      Get a logger only when isReplaying is false. Otherwise, return a NOP (no operation) logger.
      Specified by:
      getLogger in interface WorkflowContext
      Returns:
      Logger
    • getName

      public String getName()
      Gets the name of the current workflow.
      Specified by:
      getName in interface WorkflowContext
      Returns:
      the name of the current workflow
    • getInstanceId

      public String getInstanceId()
      Gets the instance ID of the current workflow.
      Specified by:
      getInstanceId in interface WorkflowContext
      Returns:
      the instance ID of the current workflow
    • getCurrentInstant

      public Instant getCurrentInstant()
      Gets the current orchestration time in UTC.
      Specified by:
      getCurrentInstant in interface WorkflowContext
      Returns:
      the current orchestration time in UTC
    • complete

      public void complete(Object output)
      Completes the current workflow.
      Specified by:
      complete in interface WorkflowContext
      Parameters:
      output - the serializable output of the completed Workflow.
    • waitForExternalEvent

      public <V> com.microsoft.durabletask.Task<V> waitForExternalEvent(String name, Duration timeout, Class<V> dataType) throws com.microsoft.durabletask.TaskCanceledException
      Waits for an event to be raised named name and returns a Task that completes when the event is received or is canceled when timeout expires.

      If the current orchestration is not yet waiting for an event named name, then the event will be saved in the orchestration instance state and dispatched immediately when this method is called. This event saving occurs even if the current orchestrator cancels the wait operation before the event is received.

      Orchestrators can wait for the same event name multiple times, so waiting for multiple events with the same name is allowed. Each external event received by an orchestrator will complete just one task returned by this method.

      Specified by:
      waitForExternalEvent in interface WorkflowContext
      Type Parameters:
      V - the expected type of the event data payload
      Parameters:
      name - the case-insensitive name of the event to wait for
      timeout - the amount of time to wait before canceling the returned Task
      dataType - the expected class type of the event data payload
      Returns:
      a new Task that completes when the external event is received or when timeout expires
      Throws:
      com.microsoft.durabletask.TaskCanceledException - if the specified timeout value expires before the event is received
    • waitForExternalEvent

      public <V> com.microsoft.durabletask.Task<Void> waitForExternalEvent(String name, Duration timeout) throws com.microsoft.durabletask.TaskCanceledException
      Waits for an event to be raised named name and returns a Task that completes when the event is received or is canceled when timeout expires.

      See waitForExternalEvent(String, Duration, Class) for a full description.

      Specified by:
      waitForExternalEvent in interface WorkflowContext
      Type Parameters:
      V - the expected type of the event data payload
      Parameters:
      name - the case-insensitive name of the event to wait for
      timeout - the amount of time to wait before canceling the returned Task
      Returns:
      a new Task that completes when the external event is received or when timeout expires
      Throws:
      com.microsoft.durabletask.TaskCanceledException - if the specified timeout value expires before the event is received
    • waitForExternalEvent

      public <V> com.microsoft.durabletask.Task<Void> waitForExternalEvent(String name) throws com.microsoft.durabletask.TaskCanceledException
      Waits for an event to be raised named name and returns a Task that completes when the event is received.

      See waitForExternalEvent(String, Duration, Class) for a full description.

      Specified by:
      waitForExternalEvent in interface WorkflowContext
      Type Parameters:
      V - the expected type of the event data payload
      Parameters:
      name - the case-insensitive name of the event to wait for
      Returns:
      a new Task that completes when the external event is received
      Throws:
      com.microsoft.durabletask.TaskCanceledException
    • isReplaying

      public boolean isReplaying()
      Description copied from interface: WorkflowContext
      Gets a value indicating whether the workflow is currently replaying a previous execution.

      Workflow functions are "replayed" after being unloaded from memory to reconstruct local variable state. During a replay, previously executed tasks will be completed automatically with previously seen values that are stored in the workflow history. Once the workflow reaches the point where it's no longer replaying existing history, this method will return false.

      You can use this method if you have logic that needs to run only when not replaying. For example, certain types of application logging may become too noisy when duplicated as part of replay. The application code could check to see whether the function is being replayed and then issue the log statements when this value is false.

      Specified by:
      isReplaying in interface WorkflowContext
      Returns:
      true if the workflow is replaying, otherwise false
    • callActivity

      public <V> com.microsoft.durabletask.Task<V> callActivity(String name, Object input, com.microsoft.durabletask.TaskOptions options, Class<V> returnType)
      Asynchronously invokes an activity by name and with the specified input value and returns a new Task that completes when the activity completes. If the activity completes successfully, the returned Task's value will be the activity's output. If the activity fails, the returned Task will complete exceptionally with a TaskFailedException.
      Specified by:
      callActivity in interface WorkflowContext
      Type Parameters:
      V - the expected type of the activity output
      Parameters:
      name - the name of the activity to call
      input - the serializable input to pass to the activity
      options - additional options that control the execution and processing of the activity
      returnType - the expected class type of the activity output
      Returns:
      a new Task that completes when the activity completes or fails
    • allOf

      public <V> com.microsoft.durabletask.Task<List<V>> allOf(List<com.microsoft.durabletask.Task<V>> tasks) throws com.microsoft.durabletask.CompositeTaskFailedException
      Returns a new Task that is completed when all the given Tasks complete. If any of the given Tasks complete with an exception, the returned Task will also complete with an CompositeTaskFailedException containing details of the first encountered failure. The value of the returned Task is an ordered list of the return values of the given tasks. If no tasks are provided, returns a Task completed with value null.

      This method is useful for awaiting the completion of a set of independent tasks before continuing to the next step in the orchestration, as in the following example:

      
       Task<String> t1 = ctx.callActivity("MyActivity", String.class);
       Task<String> t2 = ctx.callActivity("MyActivity", String.class);
       Task<String> t3 = ctx.callActivity("MyActivity", String.class);
      
       List<String> orderedResults = ctx.allOf(List.of(t1, t2, t3)).await();
       

      Exceptions in any of the given tasks results in an unchecked CompositeTaskFailedException. This exception can be inspected to obtain failure details of individual Tasks.

      
       try {
           List<String> orderedResults = ctx.allOf(List.of(t1, t2, t3)).await();
       } catch (CompositeTaskFailedException e) {
           List<Exception> exceptions = e.getExceptions()
       }
       
      Specified by:
      allOf in interface WorkflowContext
      Type Parameters:
      V - the return type of the Task objects
      Parameters:
      tasks - the list of Task objects
      Returns:
      the values of the completed Task objects in the same order as the source list
      Throws:
      com.microsoft.durabletask.CompositeTaskFailedException - if the specified timeout value expires before the event is received
    • anyOf

      public com.microsoft.durabletask.Task<com.microsoft.durabletask.Task<?>> anyOf(List<com.microsoft.durabletask.Task<?>> tasks)
      Returns a new Task that is completed when any of the tasks in tasks completes. See WorkflowContext.anyOf(Task[]) for more detailed information.
      Specified by:
      anyOf in interface WorkflowContext
      Parameters:
      tasks - the list of Task objects
      Returns:
      a new Task that is completed when any of the given Tasks complete
      See Also:
    • createTimer

      public com.microsoft.durabletask.Task<Void> createTimer(Duration duration)
      Creates a durable timer that expires after the specified delay.

      Specifying a long delay (for example, a delay of a few days or more) may result in the creation of multiple, internally-managed durable timers. The orchestration code doesn't need to be aware of this behavior. However, it may be visible in framework logs and the stored history state.

      Specified by:
      createTimer in interface WorkflowContext
      Parameters:
      duration - the amount of time before the timer should expire
      Returns:
      a new Task that completes after the specified delay
    • getInput

      public <T> T getInput(Class<T> targetType)
      Gets the deserialized input of the current task orchestration.
      Specified by:
      getInput in interface WorkflowContext
      Type Parameters:
      T - the expected type of the workflow input
      Parameters:
      targetType - the Class object associated with V
      Returns:
      the deserialized input as an object of type V or null if no input was provided.
    • callSubWorkflow

      public <V> com.microsoft.durabletask.Task<V> callSubWorkflow(String name, @Nullable Object input, @Nullable String instanceID, @Nullable com.microsoft.durabletask.TaskOptions options, Class<V> returnType)
      Asynchronously invokes another workflow as a sub-workflow and returns a Task that completes when the sub-workflow completes. If the sub-workflow completes successfully, the returned Task's value will be the activity's output. If the sub-workflow fails, the returned Task will complete exceptionally with a TaskFailedException.

      A sub-workflow has its own instance ID, history, and status that is independent of the parent workflow that started it. There are many advantages to breaking down large orchestrations into sub-workflows:

      • Splitting large orchestrations into a series of smaller sub-workflows can make code more maintainable.
      • Distributing orchestration logic across multiple compute nodes concurrently is useful if orchestration logic otherwise needs to coordinate a lot of tasks.
      • Memory usage and CPU overhead can be reduced by keeping the history of parent orchestrations smaller.
      The disadvantage is that there is overhead associated with starting a sub-workflow and processing its output. This is typically only an issue for very small orchestrations.

      Because sub-workflows are independent of their parents, terminating a parent orchestration does not affect any sub-workflows. sub-workflows must be terminated independently using their unique instance ID, which is specified using the instanceID parameter

      Specified by:
      callSubWorkflow in interface WorkflowContext
      Type Parameters:
      V - the expected type of the sub-workflow output
      Parameters:
      name - the name of the workflow to invoke
      input - the serializable input to send to the sub-workflow
      instanceID - the unique ID of the sub-workflow
      options - additional options that control the execution and processing of the activity
      returnType - the expected class type of the sub-workflow output
      Returns:
      a new Task that completes when the sub-workflow completes or fails
    • continueAsNew

      public void continueAsNew(Object input)
      Restarts the orchestration with a new input and clears its history. See WorkflowContext.continueAsNew(Object, boolean) for a full description.
      Specified by:
      continueAsNew in interface WorkflowContext
      Parameters:
      input - the serializable input data to re-initialize the instance with
    • continueAsNew

      public void continueAsNew(Object input, boolean preserveUnprocessedEvents)
      Restarts the orchestration with a new input and clears its history.

      This method is primarily designed for eternal orchestrations, which are orchestrations that may not ever complete. It works by restarting the orchestration, providing it with a new input, and truncating the existing orchestration history. It allows an orchestration to continue running indefinitely without having its history grow unbounded. The benefits of periodically truncating history include decreased memory usage, decreased storage volumes, and shorter orchestrator replays when rebuilding state.

      The results of any incomplete tasks will be discarded when an orchestrator calls continueAsNew. For example, if a timer is scheduled and then continueAsNew is called before the timer fires, the timer event will be discarded. The only exception to this is external events. By default, if an external event is received by an orchestration but not yet processed, the event is saved in the orchestration state unit it is received by a call to WorkflowContext.waitForExternalEvent(java.lang.String, java.time.Duration, java.lang.Class<V>). These events will remain in memory even after an orchestrator restarts using continueAsNew. This behavior can be disabled by specifying false for the preserveUnprocessedEvents parameter value.

      Orchestrator implementations should complete immediately after calling thecontinueAsNew method.

      Specified by:
      continueAsNew in interface WorkflowContext
      Parameters:
      input - the serializable input data to re-initialize the instance with
      preserveUnprocessedEvents - true to push unprocessed external events into the new orchestration history, otherwise false
    • newUuid

      public UUID newUuid()
      Create a new UUID that is safe for replay within a workflow.

      The default implementation of this method creates a name-based UUID using the algorithm from RFC 4122 ยง4.3. The name input used to generate this value is a combination of the workflow instance ID and an internally managed sequence number.

      Specified by:
      newUuid in interface WorkflowContext
      Returns:
      a deterministic UUID
    • getSagaContext

      public SagaContext getSagaContext()
      Description copied from interface: WorkflowContext
      get saga context.
      Specified by:
      getSagaContext in interface WorkflowContext
      Returns:
      saga context