private void OnTryFaulted(NativeActivityFaultContext faultContext, Exception propagatedException, ActivityInstance propagatedFrom) { // TODO: delete // Write event into the log // This is necessary here because the trace log won't be available later /*var record = new CustomTrackingRecord("OnTryFaulted", System.Diagnostics.TraceLevel.Error) * { * Data = * { * { "Exception", propagatedException }, * { "JobGuid", JobGuid.Get(faultContext) }, * { "UserGuid", UserGuid.Get(faultContext) }, * } * }; * faultContext.Track(record); */ // Handle exception int r = retries.Get(faultContext); retries.Set(faultContext, ++r); faultContext.CancelChild(propagatedFrom); faultContext.HandleFault(); // Run the finally block before doing anything else if (Finally != null) { faultContext.ScheduleActivity(this.Finally, OnFinallyComplete, OnFinallyFaulted); } else { OnFinallyComplete(faultContext, null); } // If retry is possible, if (r < MaxRetries.Get(faultContext)) { // absorb error faultContext.HandleFault(); faultContext.ScheduleActivity(this.Try, OnTryComplete, OnTryFaulted); } else { // fault throw propagatedException; } }
private void ActionFailed(NativeActivityFaultContext faultContext, Exception propagatedexception, ActivityInstance propagatedfrom) { Int32 currentAttemptCount = _attemptCount.Get(faultContext); Int32 maxAttempts = MaxAttempts.Get(faultContext); Type[] exceptionType = ExceptionType.Get(faultContext); //Increment and track the count currentAttemptCount++; _attemptCount.Set(faultContext, currentAttemptCount); if (currentAttemptCount >= maxAttempts) { // There are no further attempts to make return; } if (ShouldRetryAction(exceptionType, propagatedexception) == false) { _log.Error("Will only retry exception of type '" + exceptionType.ToCSV() + "'. Unhandled type of '" + propagatedexception.GetType().FullName + "' was found.", propagatedexception); return; } faultContext.CancelChild(propagatedfrom); faultContext.HandleFault(); TimeSpan retryInterval = _delayOverrideForUnitTests == null?RetryInterval.Get(faultContext) : _delayOverrideForUnitTests.Value; _log.Debug("Retrying in " + retryInterval.TotalSeconds + " seconds due to " + propagatedexception.GetType().FullName + ". " + currentAttemptCount + " of " + maxAttempts); if (retryInterval == TimeSpan.Zero) { ExecuteAttempt(faultContext); } else { // We are going to wait before trying again _delayDuration.Set(faultContext, retryInterval); faultContext.ScheduleActivity( _internalDelay, DelayCompleted); } }
private void ActionFailed(NativeActivityFaultContext faultcontext, Exception propagatedexception, ActivityInstance propagatedfrom) { Int32 currentAttemptCount = _attemptCount.Get(faultcontext); currentAttemptCount++; _attemptCount.Set(faultcontext, currentAttemptCount); Int32 maxAttempts = MaxAttempts.Get(faultcontext); if (currentAttemptCount >= maxAttempts) { // There are no further attempts to make return; } if (ShouldRetryAction(ExceptionType, propagatedexception) == false) { return; } faultcontext.CancelChild(propagatedfrom); faultcontext.HandleFault(); TimeSpan retryInterval = RetryInterval.Get(faultcontext); if (retryInterval == TimeSpan.Zero) { ExecuteAttempt(faultcontext); } else { // We are going to wait before trying again _delayDuration.Set(faultcontext, retryInterval); faultcontext.ScheduleActivity(_internalDelay, DelayCompleted); } }