private async Task SetErrorStatus(TActor actor, TStatus newStatus, string message, Exception ex) { // This method should not throw, see ProcessTranstions for the usage pattern try { Logger.LogError(ex, "{0} - process error: {message}.", actor, message); var e = new StateMachineStatusChangingArgs <TActor, TStatus>(actor, newStatus, message); await OnStatusChanging(e); actor.Status = newStatus; } catch (Exception exception) { Logger.LogError(exception, "{actor} - Unexpected error while setting error status: {message}."); actor.Status = newStatus; // Assume the proposed error status even in case of a failure } }
protected async Task <TStatus> ChangeStatus(TActor actor, TStatus newStatus, string message = null) { if (actor.Status.Equals(newStatus)) { return(newStatus); } try { var e = new StateMachineStatusChangingArgs <TActor, TStatus>(actor, newStatus, message); await OnStatusChanging(e); actor.Status = e.NewStatus; } catch (Exception ex) { Logger.LogError(ex, "{actor}: Status change failed ({statusFrom} -> {statusTo}).", actor, actor.Status, newStatus); throw new StateMachineException("Status change failed.", ex); } return(actor.Status); }
protected virtual Task OnStatusChanging(StateMachineStatusChangingArgs <TActor, TStatus> e) { return(Task.CompletedTask); }
protected override async Task OnStatusChanging(StateMachineStatusChangingArgs <ScheduleVisitActor, ScheduleVisitStatus> e) { await ScheduleService.ChangeStatus(e.Actor.RequestId, e.CurrentStatus.GetId(), e.NewStatus.GetId(), e.Message); }