コード例 #1
0
        public void PopulateQueue()
        {
            Logging.LogTrace("StatusJob: Entering PopulateQueue");

            if (!_isLocked)
            {
                _isLocked              = true;
                _departmentsService    = Bootstrapper.GetKernel().Resolve <IDepartmentsService>();
                _scheduledTasksService = Bootstrapper.GetKernel().Resolve <IScheduledTasksService>();

                var t1 = new Task(async() =>
                {
                    try
                    {
                        var allItems = await _scheduledTasksService.GetUpcomingScheduledTasksAsync();
                        Logging.LogTrace(string.Format("StatusJob: Analyzing {0} schedule tasks", allItems.Count));

                        Dictionary <int, Department> departments = new Dictionary <int, Department>();
                        foreach (var item in allItems)
                        {
                            if (!departments.ContainsKey(item.DepartmentId))
                            {
                                departments.Add(item.DepartmentId, await _departmentsService.GetDepartmentByIdAsync(item.DepartmentId));
                            }
                        }

                        // TODO: Prob a bug here as st.DepartmentId can be null
                        // Filter only the past items and ones that are 5 minutes 30 seconds in the future
                        var items = from st in allItems
                                    let department = departments[st.DepartmentId]
                                                     let runTime = st.WhenShouldJobBeRun(TimeConverterHelper.TimeConverter(DateTime.UtcNow, department))
                                                                   where
                                                                   (st.TaskType == (int)TaskTypes.DepartmentStaffingReset || st.TaskType == (int)TaskTypes.UserStaffingLevel) &&
                                                                   runTime.HasValue && runTime.Value >= TimeConverterHelper.TimeConverter(DateTime.UtcNow, department) &&
                                                                   runTime.Value <= TimeConverterHelper.TimeConverter(DateTime.UtcNow, department).AddMinutes(5).AddSeconds(30)
                                                                   select new
                        {
                            ScheduledTask = st,
                            Department    = department
                        };

                        foreach (var i in items)
                        {
                            var qi           = new StatusScheduleQueueItem();
                            qi.ScheduledTask = i.ScheduledTask;
                            qi.Department    = i.Department;

                            _queue.Enqueue(qi);
                        }
                    }
                    catch (Exception ex)
                    {
                        Logging.LogException(ex);
                    }
                    finally
                    {
                        _isLocked = false;
                        _cleared  = false;

                        _departmentsService    = null;
                        _scheduledTasksService = null;
                    }
                }, TaskCreationOptions.LongRunning);

                t1.Start();
            }
        }
コード例 #2
0
        public void PopulateQueue()
        {
            if (!_isLocked)
            {
                _isLocked = true;

                _departmentsService    = Bootstrapper.GetKernel().Resolve <IDepartmentsService>();
                _scheduledTasksService = Bootstrapper.GetKernel().Resolve <IScheduledTasksService>();
                _usersService          = Bootstrapper.GetKernel().Resolve <IUsersService>();

                Task t1 = new Task(async() =>
                {
                    try
                    {
                        var allItems = await _scheduledTasksService.GetUpcomingScheduledTasksAsync();

                        Dictionary <int, Department> departments = new Dictionary <int, Department>();
                        foreach (var item in allItems)
                        {
                            if (!departments.ContainsKey(item.DepartmentId))
                            {
                                departments.Add(item.DepartmentId, await _departmentsService.GetDepartmentByIdAsync(item.DepartmentId));
                            }
                        }

                        // TODO: There is a bug here, might not have st.DepartmentId if it's old
                        // Filter only the past items and ones that are 5 minutes 30 seconds in the future
                        var items = from st in allItems
                                    let department                         = departments[st.DepartmentId]
                                                                 let email = _usersService.GetMembershipByUserId(st.UserId).Email
                                                                             let runTime = st.WhenShouldJobBeRun(TimeConverterHelper.TimeConverter(DateTime.UtcNow, department))
                                                                                           where
                                                                                           st.TaskType == (int)TaskTypes.ReportDelivery && runTime.HasValue &&
                                                                                           runTime.Value >= TimeConverterHelper.TimeConverter(DateTime.UtcNow, department) &&
                                                                                           runTime.Value <= TimeConverterHelper.TimeConverter(DateTime.UtcNow, department).AddMinutes(5).AddSeconds(30)
                                                                                           select new
                        {
                            ScheduledTask = st,
                            Department    = department,
                            Email         = email
                        };

                        foreach (var i in items)
                        {
                            var qi           = new ReportDeliveryQueueItem();
                            qi.ScheduledTask = i.ScheduledTask;
                            qi.Department    = i.Department;
                            qi.Email         = i.Email;

                            _queue.Enqueue(qi);
                        }
                    }
                    catch (Exception ex)
                    {
                        Logging.LogException(ex);
                    }
                    finally
                    {
                        _isLocked = false;
                        _cleared  = false;

                        _departmentsService    = null;
                        _scheduledTasksService = null;
                        _usersService          = null;
                    }
                });

                t1.Start();
            }
        }