示例#1
0
        public override ServerName Execute([NotNull] object jobContext,
                                           [NotNull] JobCancellationManager jobCancellationManager)
        {
            if (jobContext == null)
            {
                throw new ArgumentNullException(nameof(jobContext));
            }
            if (jobCancellationManager == null)
            {
                throw new ArgumentNullException(nameof(jobCancellationManager));
            }

            var getServerAtDateJob = jobContext as GetServerAtDateJob;

            if (getServerAtDateJob != null)
            {
                return(TryGetServer(getServerAtDateJob.CharacterName, getServerAtDateJob.DateTime, jobCancellationManager));
            }
            var getCurrentServerJob = jobContext as GetCurrentServerJob;

            if (getCurrentServerJob != null)
            {
                return(TryGetCurrentServer(getCurrentServerJob.CharacterName, jobCancellationManager));
            }

            ParsePendingEvents();

            persistentLibrary.SaveChanged();

            throw new InvalidOperationException("No handler specified for job type: " + jobContext.GetType());
        }
        /// <summary>
        /// True if any data found
        /// </summary>
        private bool SearchLogsBackwards(DateTime datetimeTo, JobCancellationManager jobCancellationManager)
        {
            var dateFrom = datetimeTo - TimeSpan.FromDays(30);

            if (datetimeTo < wurmCharacterLogFiles.OldestLogFileDate)
            {
                return(false);
            }

            var results = logsSearcher.Scan(
                new LogSearchParameters()
            {
                CharacterName = characterName.Normalized,
                MinDate       = dateFrom,
                MaxDate       = datetimeTo,
                LogType       = LogType.Event
            }, jobCancellationManager.GetLinkedToken());

            UpdateEntity(dateFrom, datetimeTo);

            var found = ParseForServerInfo(results);

            if (found)
            {
                return(true);
            }

            return(SearchLogsBackwards(dateFrom, jobCancellationManager));
        }
        public QueuedJobsSyncRunner([NotNull] JobExecutor <TJobContext, TResult> jobExecutor, IWurmApiLogger logger)
        {
            if (jobExecutor == null)
            {
                throw new ArgumentNullException(nameof(jobExecutor));
            }
            this.jobExecutor = jobExecutor;

            searchJobTask = new Task((token) =>
            {
                var internalCancellationToken = cancellationTokenSource.Token;
                while (true)
                {
                    var signalled = jobSignaller.WaitOne(jobExecutor.IdleJobTreshhold);
                    if (internalCancellationToken.IsCancellationRequested)
                    {
                        CancelAllRemainingJobs();
                        return;
                    }
                    if (!signalled)
                    {
                        try
                        {
                            jobExecutor.IdleJob(internalCancellationToken);
                        }
                        catch (Exception exception)
                        {
                            logger.Log(LogLevel.Error, "Regular job has thrown unhandled exception.", this,
                                       exception);
                        }
                    }
                    ScanJob job;
                    while (jobQueue.TryDequeue(out job))
                    {
                        if (internalCancellationToken.IsCancellationRequested)
                        {
                            CancelAllRemainingJobs();
                            return;
                        }
                        try
                        {
                            var cancellationManager = new JobCancellationManager(internalCancellationToken,
                                                                                 job.ExternalCancellationToken);
                            var result = this.jobExecutor.Execute(job.JobContext, cancellationManager);
                            job.SetResult(result);
                        }
                        catch (Exception exception)
                        {
                            job.SetException(exception);
                        }
                    }
                    if (internalCancellationToken.IsCancellationRequested)
                    {
                        CancelAllRemainingJobs();
                        return;
                    }
                }
            }, TaskCreationOptions.LongRunning);
            searchJobTask.Start();
        }
        public ServerName TryGetAtTimestamp(DateTime timestamp, JobCancellationManager jobCancellationManager)
        {
            ParsePendingLiveLogEvents();

            var timeNow         = Time.Get.LocalNow;
            var time12MonthsAgo = timeNow.AddMonths(-12);

            // a cheap hack to reset history if its very outdated
            if (persistentData.Entity.SearchedFrom < time12MonthsAgo &&
                persistentData.Entity.SearchedTo < time12MonthsAgo)
            {
                persistentData.Entity.Reset();
            }

            if (persistentData.Entity.AnySearchCompleted &&
                timestamp >= persistentData.Entity.SearchedFrom &&
                timestamp <= persistentData.Entity.SearchedTo)
            {
                // within already scanned period
                ServerName serverName = sortedServerHistory.TryGetServerAtStamp(timestamp);
                if (serverName != null)
                {
                    // we have data, return
                    return(serverName);
                }
                // no data, we should continue
            }

            jobCancellationManager.ThrowIfCancelled();

            bool found = false;

            if (persistentData.Entity.AnySearchCompleted)
            {
                if (timestamp > persistentData.Entity.SearchedTo)
                {
                    found = SearchLogsForwards(persistentData.Entity.SearchedTo, jobCancellationManager);
                }

                if (!found || timestamp < persistentData.Entity.SearchedFrom)
                {
                    SearchLogsBackwards(persistentData.Entity.SearchedFrom, jobCancellationManager);
                }
            }
            else
            {
                found = SearchLogsForwards(timestamp, jobCancellationManager);
                if (!found)
                {
                    SearchLogsBackwards(timestamp, jobCancellationManager);
                }
                persistentData.Entity.AnySearchCompleted = true;
            }

            persistentData.FlagAsChanged();

            return(sortedServerHistory.TryGetServerAtStamp(timestamp));
        }
        public ServerName TryGetCurrentServer(JobCancellationManager jobCancellationManager)
        {
            ParsePendingLiveLogEvents();

            if (currentLiveLogsServer != null)
            {
                return(currentLiveLogsServer);
            }
            return(TryGetAtTimestamp(Time.Get.LocalNow, jobCancellationManager));
        }
示例#6
0
        public override JobResult Execute(Job jobContext, JobCancellationManager jobCancellationManager)
        {
            var dateTimeJob = jobContext as CurrentWurmDateTimeJob;

            if (dateTimeJob != null)
            {
                var dateTime = TryGetCurrentTime(jobContext.ServerName);
                return(new JobResult(dateTime, null));
            }
            var uptimeJob = jobContext as CurrentUptimeJob;

            if (uptimeJob != null)
            {
                var uptime = TryGetCurrentUptime(jobContext.ServerName);
                return(new JobResult(null, uptime));
            }
            persistentCollectionsLibrary.SaveChanged();
            throw new InvalidOperationException("Unknown type of job: " + jobContext.GetType());
        }
        /// <summary>
        /// True if any data found
        /// </summary>
        private bool SearchLogsForwards(DateTime datetimeFrom, JobCancellationManager jobCancellationManager)
        {
            var dateFrom = datetimeFrom;
            var dateTo   = datetimeFrom + TimeSpan.FromDays(30);

            var  timeNow = Time.Get.LocalNow;
            bool end     = false;

            if (dateTo > timeNow)
            {
                dateTo = timeNow;
                end    = true;
            }

            var results = logsSearcher.Scan(
                new LogSearchParameters()
            {
                CharacterName = characterName.Normalized,
                MinDate       = dateFrom,
                MaxDate       = dateTo,
                LogType       = LogType.Event
            }, jobCancellationManager.GetLinkedToken());

            UpdateEntity(dateFrom, dateTo);

            var found = ParseForServerInfo(results);

            if (found)
            {
                return(true);
            }
            if (end)
            {
                return(false);
            }

            return(SearchLogsForwards(dateTo, jobCancellationManager));
        }
示例#8
0
        ServerName TryGetCurrentServer(CharacterName character, JobCancellationManager jobCancellationManager)
        {
            ServerHistoryProvider provider = GetServerHistoryProvider(character);

            return(provider.TryGetCurrentServer(jobCancellationManager));
        }
示例#9
0
        ServerName TryGetServer(CharacterName character, DateTime exactDate, JobCancellationManager jobCancellationManager)
        {
            ServerHistoryProvider provider = GetServerHistoryProvider(character);

            return(provider.TryGetAtTimestamp(exactDate, jobCancellationManager));
        }
 /// <summary>
 /// Executes single job synchronously with other jobs and returns it's result.
 /// </summary>
 /// <param name="jobContext">Argument passed to job instance</param>
 /// <param name="jobCancellationManager">Manager for cancellation requests</param>
 /// <returns></returns>
 public abstract TResult Execute(TJobContext jobContext, JobCancellationManager jobCancellationManager);