Пример #1
0
        /// <summary>
        /// Attempt to retrieve reminders, that are my responsibility, from the global reminder table when starting this silo (reminder service instance)
        /// </summary>
        /// <returns></returns>
        public async Task Start()
        {
            myRange = ring.GetMyRange();
            logger.Info(ErrorCode.RS_ServiceStarting, "Starting reminder system target on: {0} x{1,8:X8}, with range {2}", Silo, Silo.GetConsistentHashCode(), myRange);

            await reminderTable.Init(config, logger).WithTimeout(initTimeout);

            await ReadAndUpdateReminders();

            logger.Info(ErrorCode.RS_ServiceStarted, "Reminder system target started OK on: {0} x{1,8:X8}, with range {2}", Silo, Silo.GetConsistentHashCode(), myRange);

            status = ReminderServiceStatus.Started;
            startedTask.TrySetResult(true);
            var random  = new SafeRandom();
            var dueTime = random.NextTimeSpan(Constants.RefreshReminderList);

            listRefresher = GrainTimer.FromTaskCallback(
                _ => ReadAndUpdateReminders(),
                null,
                dueTime,
                Constants.RefreshReminderList,
                name: "ReminderService.ReminderListRefresher");
            listRefresher.Start();
            ring.SubscribeToRangeChangeEvents(this);
        }
Пример #2
0
        /// <summary>
        /// Attempt to retrieve reminders, that are my responsibility, from the global reminder table when starting this silo (reminder service instance)
        /// </summary>
        /// <returns></returns>
        public async Task Start()
        {
            myRange = ring.GetMyRange();
            logger.Info(ErrorCode.RS_ServiceStarting, "Starting reminder system target on: {0} x{1,8:X8}, with range {2}", Silo, Silo.GetConsistentHashCode(), myRange);

            // in case reminderTable is as grain, poke the grain to activate it, before slamming it with multipel parallel requests, which may create duplicate activations.
            await reminderTable.Init();

            await ReadAndUpdateReminders();

            logger.Info(ErrorCode.RS_ServiceStarted, "Reminder system target started OK on: {0} x{1,8:X8}, with range {2}", Silo, Silo.GetConsistentHashCode(), myRange);

            status = ReminderServiceStatus.Started;
            startedTask.TrySetResult(true);
            var random  = new SafeRandom();
            var dueTime = random.NextTimeSpan(Constants.RefreshReminderList);

            listRefresher = GrainTimer.FromTaskCallback(
                _ => ReadAndUpdateReminders(),
                null,
                dueTime,
                Constants.RefreshReminderList,
                name: "ReminderService.ReminderListRefresher");
            listRefresher.Start();
            ring.SubscribeToRangeChangeEvents(this);
        }
Пример #3
0
        private void PromoteToStarted()
        {
            if (stoppedCancellationTokenSource.IsCancellationRequested)
            {
                return;
            }

            logger.Info(ErrorCode.RS_ServiceStarted, "Reminder system target started OK on: {0} x{1,8:X8}, with range {2}", this.Silo, this.Silo.GetConsistentHashCode(), this.myRange);

            status = ReminderServiceStatus.Started;
            startedTask.TrySetResult(true);
            var random  = new SafeRandom();
            var dueTime = random.NextTimeSpan(Constants.RefreshReminderList);

            if (listRefresher != null)
            {
                listRefresher.Dispose();
            }
            listRefresher = GrainTimer.FromTaskCallback(
                _ => ReadAndUpdateReminders(),
                null,
                dueTime,
                Constants.RefreshReminderList,
                name: "ReminderService.ReminderListRefresher");
            listRefresher.Start();
            ring.SubscribeToRangeChangeEvents(this);
        }
Пример #4
0
            public void StartTimer(Func <object, Task> asyncCallback, TraceLogger logger)
            {
                StopReminder(logger); // just to make sure.
                var dueTimeSpan = CalculateDueTime();

                Timer = GrainTimer.FromTaskCallback(asyncCallback, this, dueTimeSpan, period, name: ReminderName);
                if (logger.IsVerbose)
                {
                    logger.Verbose("Reminder {0}, Due time{1}", this, dueTimeSpan);
                }
                Timer.Start();
            }
Пример #5
0
        private void StartTimer()
        {
            if (timer != null)
            {
                timer.Dispose();
            }

            timer = GrainTimer.FromTimerCallback(
                this.OnGossipTimerTick,
                null,
                this.backgroundGossipInterval,
                this.backgroundGossipInterval,
                "MultiCluster.GossipTimer");

            timer.Start();
        }
Пример #6
0
        private async Task StartInBackground()
        {
            await DoInitialReadAndUpdateReminders();

            if (status == ReminderServiceStatus.Booting)
            {
                var random = new SafeRandom();
                listRefresher = GrainTimer.FromTaskCallback(
                    _ => DoInitialReadAndUpdateReminders(),
                    null,
                    random.NextTimeSpan(InitialReadRetryPeriod),
                    InitialReadRetryPeriod,
                    name: "ReminderService.ReminderListInitialRead");
                listRefresher.Start();
            }
        }