/// <summary> /// Documents the special transition. /// </summary> /// <param name="eventId">The event unique identifier.</param> /// <param name="exitRequest">The exit request.</param> /// <param name="removeEvent">if set to <c>true</c> [remove event].</param> /// <param name="autoResume">if set to <c>true</c> [automatic resume].</param> /// <param name="queueDataAccess">The queue data access.</param> /// <param name="executionTime">The execution time.</param> /// <returns></returns> private AsyncHandlerResult DoSpecialTransition(Guid eventId, AsyncHandlerEarlyExitRequest exitRequest, bool removeEvent, bool autoResume, IQueueDataAccess queueDataAccess, double executionTime) { AsyncHandlerResult result = null; switch (exitRequest) { case AsyncHandlerEarlyExitRequest.Pause: { DateTime nextOccurrence = DateTime.MinValue; // 默认当做是作业干预的延迟操作,沿用延迟时间 if (autoResume) { // 自动重启,设为1分钟后可调度 nextOccurrence = DateTime.Now.AddMinutes(1.0); } var newEventState = new AsyncEventState { EventId = eventId, NewState = 1, NewStatus = 10, NextOccurrence = nextOccurrence, RetryOperation = false, CurrentRetryCount = 0, ErrorCode = 0, ClearData = false, ExecutionTime = executionTime }; queueDataAccess.UpdateStateAndStatus(newEventState); result = new AsyncPausedResult(); break; } case AsyncHandlerEarlyExitRequest.Cancel: { var newEventState2 = new AsyncEventState { EventId = eventId, NewState = 3, NewStatus = 32, NextOccurrence = System.DateTime.MinValue, RetryOperation = false, CurrentRetryCount = 0, ErrorCode = 0, ClearData = false, ExecutionTime = executionTime }; queueDataAccess.UpdateStateAndStatus(newEventState2); result = new AsyncCanceledResult(); break; } default: AsyncServiceException.Assert(false, "错误的状态: " + exitRequest.ToString()); break; } if (removeEvent) { RemoveSpecialTransition(eventId); } return result; }
/// <summary> /// Updates the state of the event. /// </summary> /// <param name="asyncEvent">The asynchronous event.</param> /// <param name="result">The result.</param> private void UpdateEventState(AsyncEvent asyncEvent, AsyncHandlerResult result) { var instance = this._dataAccessFactory.CreateInstance(this, Configuration.OrganizationConfiguration); var newStatus = result.ResultCode; int newState = 3; int errorCode = 0; string errorMessage = null; string friendlyMessage = null; bool retryOperation = false; var handlerResultWithError = result as AsyncHandlerResultWithError; if (handlerResultWithError != null) { errorCode = handlerResultWithError.ErrorCode; errorMessage = handlerResultWithError.ErrorMessage; friendlyMessage = handlerResultWithError.FriendlyMessage; } else { var resultWithMessage = result as AsyncHandlerResultWithMessage; if (resultWithMessage != null) friendlyMessage = resultWithMessage.Message; } var nextOccurrence = DateTime.MinValue; if (result is AsyncRetryResult) { if (asyncEvent.RetryCount < this.Configuration.MaximumRetries || errorCode == -2147180543) // -2147180543 = The server is busy and the request was not completed. Try again later. { retryOperation = true; } else { nextOccurrence = DateTime.MaxValue; LogEvent(EventLogEntryType.Error, 3221242897L, Environment.MachineName, asyncEvent.OperationType, errorCode.ToString("x", (IFormatProvider)CultureInfo.InvariantCulture), errorMessage); } } var asyncPausedResult = result as AsyncPausedResult; if (asyncPausedResult != null && asyncPausedResult.PostponeUntil != DateTime.MinValue) nextOccurrence = asyncPausedResult.PostponeUntil; switch (newStatus) { case 20: return; case 21: case 10: if (retryOperation && this.HandleSpecialTransition(asyncEvent) != null) return; newState = 1; newStatus = 10; break; case 22: case 32: newState = 3; newStatus = 32; break; case 0: AsyncServiceException.Assert(false, "错误状态: " + newStatus); break; } if (result is AsyncSystemPausedResult) nextOccurrence = DateTime.MaxValue; if (asyncEvent.IsRecurrenceEvent) { nextOccurrence = NextOccurrence(asyncEvent); if (nextOccurrence == DateTime.MinValue) { newState = 3; newStatus = 30; } else { newState = 1; newStatus = 10; } } if (newState == 1 && newStatus == 10 && asyncEvent.AutoResumeFromPause) nextOccurrence = DateTime.Now.AddMinutes(1.0); var newEventState = new AsyncEventState() { EventId = asyncEvent.EventId, NewState = newState, NewStatus = newStatus, NextOccurrence = nextOccurrence, RetryOperation = retryOperation, CurrentRetryCount = asyncEvent.RetryCount, ErrorCode = errorCode, ErrorMessage = errorMessage, FriendlyMessage = friendlyMessage, ClearData = this.CanClearData(newState, asyncEvent), ExecutionTime = asyncEvent.ExecutionTimeSeconds, CanRemoveEvent = this.CanRemoveEvent(asyncEvent, result), HandlerResult = result }; instance.UpdateStateAndStatus(newEventState); RemoveSpecialTransition(asyncEvent.EventId); }