예제 #1
0
        protected HttpResponseMessage StartJob(Action <ISession, Config.Config, RequestLog> cmd)
        {
            var existsJob = new RequestLog(CurrentUser, Request, GetType().Name);

            existsJob.StartJob(Session, (x, y) => cmd(x, Config, y));
            return(existsJob.ToResult(Request, Config));
        }
예제 #2
0
        public void Process_request()
        {
            var job = new RequestLog(user, new Version());

            job.StartJob(session, (_, ___) => {});
            scheduler.Run();
            session.Refresh(job);
            Assert.That(job.Error, Is.Null);
            Assert.That(job.IsCompleted, Is.True);
            Assert.That(job.IsFaulted, Is.False);
        }
예제 #3
0
        public void Log_broken_job()
        {
            var job = new RequestLog(user, new Version());

            job.StartJob(session,
                         (jobSession, requestJob) => {
                throw new Exception("Тестовое исключение");
            });
            scheduler.Run();
            session.Refresh(job);
            Assert.That(job.Error, Is.Not.Null);
            Assert.That(job.IsCompleted, Is.True);
            Assert.That(job.IsFaulted, Is.True);
        }
예제 #4
0
        public HttpResponseMessage Get(bool reset        = false,
                                       string data       = null,
                                       DateTime?lastSync = null,
                                       //перечень активных адресов доставки через запятую
                                       //для экспорта неподтвержденных заявок
                                       string addressIds = null,
                                       uint?id           = null)
        {
            if (id != null)
            {
                return(Session.Load <RequestLog>(id.Value).ToResult(Request, Config));
            }

            var        updateType = data ?? GetType().Name;
            RequestLog existsJob  = null;

            //если это новый запрос то пытаемся найти уже подготовленные данные которые не протухли или в процессе
            //что бы избежать дополнительной нагрузки на сервер
            if (reset)
            {
                if (Config.UpdateLifeTime > TimeSpan.Zero)
                {
                    var version = RequestLog.GetVersion(Request);
                    //если есть не загруженные данные отдаем их
                    //каждая версия хранит подготовленные данные в своей директории
                    //по этому передавать неподтвержденные данные есть смысл только в рамках версии
                    existsJob = Session.Query <RequestLog>()
                                .Where(j => j.UpdateType == updateType &&
                                       !j.IsConfirmed &&
                                       !j.IsFaulted &&
                                       j.User == CurrentUser &&
                                       j.Version == version)
                                .OrderByDescending(j => j.CreatedOn)
                                .Take(1)
                                .ToArray()
                                .FirstOrDefault(x => x.GetIsStale(Config.UpdateLifeTime) == false);
                }
            }
            else
            {
                existsJob = TryFindJob(updateType);
            }

            if (existsJob == null)
            {
                existsJob = new RequestLog(CurrentUser, Request, updateType, lastSync);
                existsJob.StartJob(Session,
                                   (session, job) => {
                    using (var exporter = new Exporter(session, Config, job)) {
                        exporter.Addresses = addressIds?.Split(',')
                                             .Select(x => session.Load <Address>(Convert.ToUInt32(x)))
                                             .ToArray()
                                             ?? new Address[0];
                        if (data.Match("Waybills"))
                        {
                            exporter.ExportDocs();
                        }
                        else
                        {
                            //если есть обновление исполняемых файлов то готовить данные нет смысла
                            //тк схема данных могла измениться и клиент все равно будет загружать кумулятивное
                            //после обновления бинарных файлов
                            if (data.Match("NoBin") || !exporter.ExportBin())
                            {
                                exporter.ExportDb();
                            }
                        }
                        //все данные выгружены завершаем транзакцию
                        session.Transaction.Commit();
                        exporter.Compress(job.OutputFile(Config));
                    }
                });
            }

            return(existsJob.ToResult(Request, Config));
        }