1

In one of my orchestrations a timer gets based on a date specified in the orchestration input object. This date sometimes needs to be updated after the orchestration has started. I am currently trying to implement an event that cancels the existing timer and creates a new timer with the updated date.

I am able to cancel the existing timer successfully and also I am able to set a new timer but the new timer does not seem to be firing.

Durable Task Monitor Log

my onEvent method in my orchestration finds the required event handler based on the input and then calls the HandleProcess method.

public override async void OnEvent(OrchestrationContext context, string eventName, string input)
{
    IEventHandler eventHandler = await context.ScheduleTask<IEventHandler>(typeof(GetEventHandler), eventName);

    EventHandlerInput eventInput = new EventHandlerInput(context, customState, input);
    customState = eventHandler.HandleProcess(eventInput);
}

The date change event handler HandleProcess method cancels the current timer and schedules a new timer

public CustomOrchestrationState HandleProcess<T>(T input)
{
  EventHandlerInput customInput = (input as EventHandlerInput);

  if (!customInput.CustomOrchestrationState.AllowActionDateChange)
  {
      //date change not allowed
      throw new Exception();
  }

  DateTime newDate = new DateTime();

  try
  {
      newDate = Convert.ToDateTime(customInput.EventInput);
  }
  catch (Exception ex)
  {
      //Invalid Date format
  }

  CancellationTokenSource newToken = new CancellationTokenSource();
  customInput.OrchestrationContext.CreateTimer(newDate, customInput, newToken.Token);

  customInput.CustomOrchestrationState.TimerCancelationToken?.Dispose();

  CancelCurrentTimer(customInput.CustomOrchestrationState);

  customInput.CustomOrchestrationState.ActionDate = newDate;
  customInput.CustomOrchestrationState.TimerCancelationToken = newToken;

  return customInput.CustomOrchestrationState;
}  

In the SQL database I can see that the new timer is created but the orchestration seems to stay stuck when the new timer should have fired.

TimerCreated Event In DB

Is this behavior expected or is it a bug? Am I missing something or doing something wrong?

1 Answer 1

0

DateTime API's shouldn't be used in orchestrators because they are non-deterministic. See Durable orchestrator constraints.

I think you may need to base off of IDurableOrchestrationContext.CurrentUtcDateTime and do any date math from there.

Sign up to request clarification or add additional context in comments.

Comments

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.