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);
                    }
        }
Exemplo n.º 2
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);
                    }
        }
Exemplo n.º 3
0
        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();
                        }
                    }
                }
        }
Exemplo n.º 4
0
        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();
            }
        }
Exemplo n.º 5
0
        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));
 }