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(); } }
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(); } }