/// <summary> /// Выполнить синхронизацию. /// </summary> public void Sync( ISyncContext context, TSvc svc, int retries, ITaskIndicator indicator) { if (context == null) throw new ArgumentNullException("context"); if (svc == null) throw new ArgumentNullException("svc"); if (indicator == null) throw new ArgumentNullException("indicator"); indicator.SetTaskState(SyncTaskState.Sync); try { context.CheckState(); indicator.SetStatusText(SyncResources.IndicatorPrepareRequest); var rq = PrepareRequest(context); if (rq == null) return; // Nothing to do context.CheckState(); indicator.SetStatusText(SyncResources.IndicatorMakeRequest); var rsp = context.CallWithRetries(rq, GetDisplayName(), retries, () => MakeRequest(context, svc, rq)); context.CheckState(); indicator.SetStatusText(SyncResources.IndicatorProcessResponse); ProcessResponse(context, rq, rsp); context.CheckState(); indicator.SetTaskState(SyncTaskState.Succeed); indicator.SetStatusText(SyncResources.IndicatorSuccessFinish); } // Отмену пользователем не трактуем как ошибку и выкидываем наверх catch (UserCancelledException) { throw; } catch (Exception ex) { indicator.SetTaskState(SyncTaskState.Failed); indicator.SetStatusText(ex.Message); context.TryAddSyncError( new SyncErrorInfo(SyncErrorType.CriticalError, GetDisplayName(), ex.ToString())); } }
protected override void ProcessResponse( ISyncContext context, PostRequest request, PostResponse response) { ClearOutbox(context, response.commitedIds); ClearRatesOutbox(context); context.StatisticsContainer.AddValue(JanusATInfo.OutboundMessagesStats, response.commitedIds.Length); context.StatisticsContainer.AddValue(JanusATInfo.FailedOutboundMessagesStats, response.exceptions.Length); context.StatisticsContainer.AddValue(JanusATInfo.OutboundRatesStats, request.rates.Length); foreach (var ex in response.exceptions) { context.TryAddSyncError( new SyncErrorInfo(SyncErrorType.CriticalError, GetDisplayName(), ex.exception)); } // TODO: Нужна какая то механика, отображающая исключения для каждого сообщения в UI исходящих }
public static TRsp CallWithRetries <TRq, TRsp>( this ISyncContext context, TRq request, string taskName, int retriesCount, Func <TRsp> requestMaker) { var resp = default(TRsp); var retries = retriesCount + 1; while (retries-- > 0) { try { resp = requestMaker(); } // Отмену пользователем не трактуем как ошибку и выкидываем наверх catch (UserCancelledException) { throw; } catch (Exception ex) { if (retries > 0) { context.LogWarning(SyncResources.ErrorMessage.FormatStr(ex.Message)); context.TryAddSyncError( new SyncErrorInfo(SyncErrorType.Warning, taskName, ex.ToString())); context.CheckState(); continue; } throw; } break; } return(resp); }