/// <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()));
            }
        }
Example #2
0
        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 исходящих
        }
Example #3
0
        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);
        }