public bool RemoveSingleTask(int id) { using (var tr = new TransactionScope(TransactionScopeOption.Suppress, TransactionScopeAsyncFlowOption.Enabled)) using (var conn = CreateConnection()) using (var cmd = DbAccessHelper.CreateDbCommand(conn, SQL_REMOVE_SINGLE)) { cmd.Parameters.Add(new SqlParameter("id", id)); cmd.Parameters.Add(new SqlParameter("status", (int)Distributed.SingleTaskStatus.Scheduled)); return(cmd.ExecuteNonQuery() > 0); } }
private bool SetRunningStatus(TaskExecutionInfo executionInfoLocal, TaskTypeInfo taskTypeInfo) { var lockInfo = executionInfoLocal.LockInfo; var taskDefinition = executionInfoLocal.TaskDefinition; //It may be that the task scheduler took too long to start the thread. //Renews the lock. Ignores the task if it doesn't acquire lock if (!_taskManager.LockManager.TryRenewLock(lockInfo, taskTypeInfo.LockCycle, retryLock: true)) { return(false); } using (var tr = new TransactionScope(TransactionScopeOption.Suppress, TransactionScopeAsyncFlowOption.Enabled)) using (var conn = _taskManager.CreateConnection()) using (var command = DbAccessHelper.CreateDbCommand(conn, SET_RUNNING_STATUS_SQL)) { //milisecond precision var lastRunAt = _taskManager.GetUtcNow().SetFractionalSecondPrecision(3); var lockState = lockInfo.AsImmutable(); command.Parameters.Add(new SqlParameter("Id", taskDefinition.Id)); command.Parameters.Add(new SqlParameter("LastRunAt", System.Data.SqlDbType.DateTime2) { Value = lastRunAt }); command.Parameters.Add(new SqlParameter("LockedUntil", System.Data.SqlDbType.DateTime2) { Value = lockState.LockedUntil }); //Has the task been deleted or already handled? if (command.ExecuteNonQuery() != 1) { return(false); } executionInfoLocal.LastRunAt = lastRunAt; return(true); } }
private void CleanupTasks() { using (var tr = new TransactionScope(TransactionScopeOption.Suppress, TransactionScopeAsyncFlowOption.Enabled)) using (var conn = _taskManager.CreateConnection()) { //precision up to 4 decimals of a second var utcNow = _taskManager.GetUtcNow().SetFractionalSecondPrecision(4); if (FixAbandonedLastRunAt > utcNow) //datetime change { FixAbandonedLastRunAt = DateTime.MinValue; } //Runs every 30 secs if (utcNow.Subtract(FixAbandonedLastRunAt) > _30Seconds) { FixAbandonedLastRunAt = utcNow; using (var abandonedCmd = DbAccessHelper.CreateDbCommand(conn, FIX_ABANDONED_TASK_SQL)) { abandonedCmd.ExecuteNonQuery(); } } if (CleanupLastRunAt > utcNow) //datetime change { CleanupLastRunAt = DateTime.MinValue; } //Runs every minute if (utcNow.Subtract(CleanupLastRunAt) > OneMinute) { CleanupLastRunAt = utcNow; using (var cleanupCmd = DbAccessHelper.CreateDbCommand(conn, CLEANUP_RECCURENT_LOG_SQL)) { cleanupCmd.ExecuteNonQuery(); } } } }
private void SetCompletedOrCancelledStatus(TaskExecutionInfo executionInfoLocal) { executionInfoLocal.SendAliveSignal(); var lockInfo = executionInfoLocal.LockInfo; var taskDefinition = executionInfoLocal.TaskDefinition; /* We should not renew lock here because the task has already completed */ //If the task didn't run, don't do anything. if (executionInfoLocal.LastRunAt == null) { return; } try { using (var tr = new TransactionScope(TransactionScopeOption.Suppress, TransactionScopeAsyncFlowOption.Enabled)) using (var conn = _taskManager.CreateConnection()) using (var command = DbAccessHelper.CreateDbCommand(conn, SET_COMPLETED_STATUS_FOR_RUNNING)) { var newStatus = executionInfoLocal.IsCancellationRequested ? Distributed.SingleTaskStatus.CompletedCancelled : Distributed.SingleTaskStatus.Completed; command.Parameters.Add(new SqlParameter("Id", taskDefinition.Id)); command.Parameters.Add(new SqlParameter("LastRunAt", System.Data.SqlDbType.DateTime2) { Value = executionInfoLocal.LastRunAt }); command.Parameters.Add(new SqlParameter("NewStatus", (int)newStatus)); command.ExecuteNonQuery(); } } catch (Exception ex) { ex.LogException(); } }
private void RenewTaskLock(TaskExecutionInfo taskInfo) { //renews lock if (_taskManager.LockManager.TryRenewLock(taskInfo.LockInfo)) { try { using (var tr = new TransactionScope(TransactionScopeOption.Suppress, TransactionScopeAsyncFlowOption.Enabled)) using (var conn = _taskManager.CreateConnection()) using (var command = DbAccessHelper.CreateDbCommand(conn, SET_LOCKEDUNTIL_SQL)) { var lockedUntil = taskInfo.LockInfo.AsImmutable().LockedUntil; if (lockedUntil == null) { return; } command.Parameters.Add(new SqlParameter("Id", taskInfo.TaskDefinition.Id)); command.Parameters.Add(new SqlParameter("LastRunAt", System.Data.SqlDbType.DateTime2) { Value = taskInfo.LastRunAt }); command.Parameters.Add(new SqlParameter("LockedUntil", System.Data.SqlDbType.DateTime2) { Value = lockedUntil }); command.ExecuteNonQuery(); } } catch (Exception ex) { ex.LogException(); } } }
internal IDbConnection CreateConnection() { return(DbAccessHelper.CreateDbConnection(_connectionString)); }