public async Task HandleTask(ILeasedTask task, CancellationToken cancellationToken) { if (task == null) { throw new ArgumentNullException(nameof(task)); } switch (task.GetHandlerSubType()) { case TaskHandlerSubType.USERS_UPDATE: await UpdateUsers(cancellationToken); break; case TaskHandlerSubType.TEAMS_UPDATE: await UpdateTeams(cancellationToken); break; case TaskHandlerSubType.MEMBERS_UPDATE: await UpdateMembers(cancellationToken); break; case TaskHandlerSubType.ONCALL_UPDATE: await UpdateOnCall(cancellationToken); break; default: break; } }
private async Task TryLockAndHandleTask(ILeasedTask task, CancellationToken stoppingToken) { // Try get a lock on the task await using (var leasedLock = _leasedLockProvider.Create( task.Id, task.GetLeaseDuration(), GetExtensionInterval(task.GetLeaseDuration()), // This prevents for the lock to be released // while the task its being handled HandlerLeasedLockException)) { _logger.LogInformation( $"Attempting to get lock on task with Id {task.Id}"); // Try get the lock on the task var lockAcquired = await leasedLock.TryAcquireAsync(); if (!lockAcquired) { _logger.LogInformation( $"Unable to acquire lock for task with Id {task.Id}"); return; } // We have succesfully leased the task var handler = _taskHandlerRegistry.GetForHandlerType(task.GetHandlerType()); try { await handler.HandleTask(task, stoppingToken); } catch (Exception exception) { _logger.LogError(exception, $"Error handling task with Id {task.Id}"); } } }
public async Task CreateTask(ILeasedTask task, CancellationToken cancellationToken) { if (task == null) { throw new ArgumentNullException(nameof(task)); } var taskModel = (LeasedTask)task; await _context.Tasks.AddAsync(taskModel, cancellationToken); await _context.SaveChangesAsync(); }
public async Task UpdateTask(ILeasedTask task, CancellationToken cancellationToken) { if (task == null) { throw new ArgumentNullException(nameof(task)); } var entity = await _context.Tasks.SingleAsync(t => t.Id == task.Id); entity.HandlerSubType = task.HandlerSubType; entity.HandlerType = task.HandlerType; entity.NextTimeToRun = task.NextTimeToRun; await _context.SaveChangesAsync(); }
public static TimeSpan GetLeaseDuration(this ILeasedTask leasedTask) { return(TimeSpan.FromMilliseconds(leasedTask.LeaseDuration)); }
public static TaskHandlerSubType GetHandlerSubType(this ILeasedTask leasedTask) { return(Enum.Parse <TaskHandlerSubType>(leasedTask.HandlerSubType, true)); }