Example #1
0
        private Uri BuildTaskCallbackUri(ConfiguredTask taskConfig, long occurrence)
        {
            if (!taskConfig.Url.IsAbsoluteUri && _context != null && _context.Request != null)
            {
                string callbackUrlLeftPart = $"{_context.Request.Scheme}{UriKeys.SchemeDelimiter}{_context.Request.Host.ToUriComponent()}";

                return(new Uri(string.Concat(
                                   callbackUrlLeftPart,
                                   _recurringTaskHandlerAbsolutePath,
                                   taskConfig.Identifier,
                                   "/",
                                   occurrence.ToString(CultureInfo.InvariantCulture)
                                   ), UriKind.Absolute));
            }

            return(new Uri(string.Concat(
                               taskConfig.Url.Scheme,
                               UriKeys.SchemeDelimiter,
                               taskConfig.Url.Authority,
                               _recurringTaskHandlerAbsolutePath,
                               taskConfig.Identifier,
                               "/",
                               occurrence.ToString(CultureInfo.InvariantCulture)
                               )));
        }
Example #2
0
        private CallbackRequest PrepareNextCallback(ConfiguredTask taskConfig)
        {
            long           occurrence   = taskConfig.GetNextOccurrence();
            Uri            callbackUri  = BuildTaskCallbackUri(taskConfig, occurrence);
            DateTimeOffset callbackTime = new DateTimeOffset(occurrence, TimeSpan.Zero);

            return(new CallbackRequest(callbackTime, callbackUri));
        }
Example #3
0
        internal bool TryGetTask(string identifier, out ConfiguredTask taskConfig)
        {
            if (string.IsNullOrEmpty(identifier))
            {
                taskConfig = null;
                return(false);
            }

            return(_taskCollection.TryGetTask(identifier, out taskConfig));
        }
Example #4
0
        async Task AddTaskAsync(IClockSource clockSource, PeriodicityType periodicity, int day, int hour, int minute, Uri url)
        {
            using (var taskBuilder = new TaskBuilder(CallbackBaseUri))
            {
                ConfiguredTask taskConfig = taskBuilder.Create(clockSource, periodicity, day, hour, minute, url);

                if (await _taskCollection.AddAsync(taskConfig))
                {
                    if (CallbackBaseUri == null)
                    {
                        ScavengeForCallbackBaseUri(taskConfig.Url);
                    }

                    await Schedule(PrepareNextCallback(taskConfig));

                    if (!_currentState.IsActive)
                    {
                        await Start();
                    }
                }
            }
        }
Example #5
0
        public async Task <bool> AddAsync(ConfiguredTask taskConfig)
        {
            // A proper immutable dictionary class would simplify this routine
            RandomWaitScheduler retryScheduler = null;

            do
            {
                Dictionary <string, ConfiguredTask> original = _Tasks;

                if (!original.ContainsKey(taskConfig.Identifier))
                {
                    var clone = new Dictionary <string, ConfiguredTask>(original);

                    if (!clone.ContainsKey(taskConfig.Identifier))
                    {
                        clone.Add(taskConfig.Identifier, taskConfig);

                        if (!object.ReferenceEquals(Interlocked.CompareExchange(ref _Tasks, clone, original), original))
                        {
                            if (retryScheduler == null)
                            {
                                retryScheduler = new RandomWaitScheduler();
                            }

                            await retryScheduler.Wait();

                            continue;
                        }

                        return(true);
                    }
                }

                return(false);
            } while (true);
        }
Example #6
0
 public bool TryGetTask(string identifier, out ConfiguredTask taskConfig) => _Tasks.TryGetValue(identifier, out taskConfig);
Example #7
0
 public async Task <bool> RemoveAsync(ConfiguredTask taskConfig) => await RemoveAsync(taskConfig.Identifier);
Example #8
0
 internal async Task Reschedule(ConfiguredTask taskConfig)
 {
     await Schedule(PrepareNextCallback(taskConfig));
 }