예제 #1
0
 /// <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;
 }
예제 #2
0
 /// <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);
 }