예제 #1
0
        /// <summary>
        /// Try to restart the task.
        /// </summary>
        /// <param name="taskStateModel">The <see cref="TaskStateModel"/> instance.</param>
        /// <param name="timeShift">Time shift.</param>
        /// <param name="repeatCrashCount">Count of attempts that will be used for reruning this task after its crashed.</param>
        /// <param name="msg">Message that explains the restart.</param>
        /// <param name="exception">Exception that explains the restart.</param>
        public void RestartTask(TaskStateModel taskStateModel, TimeSpan timeShift, int repeatCrashCount, string msg, Exception exception)
        {
            StringBuilder stringBuilder = new StringBuilder();

            stringBuilder.AppendFormat("UPDATE {0}.{1} ", sqlSettings.WiseQueueDefaultSchema, taskTableName);
            if (repeatCrashCount <= 0)
            {
                stringBuilder.AppendFormat("SET [ExecuteAt]=GETUTCDATE(), [RepeatCrashCount]=0, [State] = {0}", (short)TaskStates.Failed);
            }
            else
            {
                stringBuilder.AppendFormat("SET [ExecuteAt]=GETUTCDATE() +'{0}', [RepeatCrashCount]={1}, [ServerId] = NULL, [State] = {2}", timeShift, repeatCrashCount, (short)TaskStates.New);
            }

            stringBuilder.AppendFormat("WHERE [Id] = {0} AND [QueueId] = {1} AND [ServerId] = {2}", taskStateModel.Id, taskStateModel.QueueId, taskStateModel.ServerId);

            string sqlCommand = stringBuilder.ToString();

            using (IDbConnection connection = connectionFactory.CreateConnection())
            {
                //TODO: Transaction ???
                using (IDbTransaction transaction = connection.BeginTransaction(IsolationLevel.Serializable))
                {
                    using (IDbCommand command = connectionFactory.CreateCommand(connection))
                    {
                        command.CommandText = sqlCommand;
                        command.ExecuteNonQuery();
                        transaction.Commit();
                    }
                }
            }
        }
예제 #2
0
        public async Task <ActionResult <TaskStateModel> > PostTaskStateModel(TaskStateModel taskStateModel)
        {
            var allStates = await _context.TaskStateModels.ToListAsync();

            for (int i = 0; i <= allStates.Count() - 2; i++)
            {
                if (allStates[i].OrderNr == taskStateModel.OrderNr)
                {
                    allStates[i].OrderNr++;
                }
                if (allStates[i].OrderNr == allStates[i + 1].OrderNr)
                {
                    allStates[i + 1].OrderNr++;
                }
            }
            //foreach(TaskStateModel t in allStates)
            //{
            //    if(t.OrderNr == taskStateModel.OrderNr)
            //    {
            //        t.OrderNr++;
            //    }
            //}

            _context.TaskStateModels.Add(taskStateModel);
            await _context.SaveChangesAsync();

            return(CreatedAtAction("GetTaskStateModel", new { id = taskStateModel.TaskStateID }, taskStateModel));
        }
예제 #3
0
        private void RestartTask(TaskModel taskModel, string msg, Exception ex)
        {
            int repeatCrashCount = taskModel.ScheduleInformation.RepeatCrashCount - 1;
            //if (repeatCrashCount <= 1)
            //{
            //    logger.WriteTrace("All restart attempts have been expired. Task will be mark as failed.");
            //    //TODO: Set RepeatCrashCount to 0
            //    //TODO: Add message why task has been failed.
            //    TaskStateModel taskStateModel = new TaskStateModel(taskModel.Id, taskModel.QueueId, taskModel.ServerId, TaskStates.Failed);
            //    taskDataContext.SetTaskState(taskStateModel);
            //}
            //else
            //{
            TaskStateModel taskStateModel;

            if (repeatCrashCount > 0)
            {
                logger.WriteTrace("Task will be restarted.");
                taskStateModel = new TaskStateModel(taskModel.Id, taskModel.QueueId, taskModel.ServerId, TaskStates.New);
            }
            else
            {
                logger.WriteTrace("Task will be failed.");
                taskStateModel = new TaskStateModel(taskModel.Id, taskModel.QueueId, taskModel.ServerId, TaskStates.Failed);
            }
            taskDataContext.RestartTask(taskStateModel, timeShiftAfterCrash, repeatCrashCount, msg, ex);
            //}
        }
예제 #4
0
        public async Task <IActionResult> PutTaskStateModel(int id, TaskStateModel taskStateModel)
        {
            if (id != taskStateModel.TaskStateID)
            {
                return(BadRequest());
            }

            _context.Entry(taskStateModel).State = EntityState.Modified;

            try
            {
                await _context.SaveChangesAsync();
            }
            catch (DbUpdateConcurrencyException)
            {
                if (!TaskStateModelExists(id))
                {
                    return(NotFound());
                }
                else
                {
                    throw;
                }
            }

            return(NoContent());
        }
예제 #5
0
        public async Task <bool> UpdateTaskState(TaskStateModel taskStateModel)
        {
            await loadAuthTask;
            var   content  = JsonSerializer.Serialize(taskStateModel);
            var   response = await _httpClient.PutAsync($"api/TaskState", new StringContent(content, Encoding.UTF8, "application/json"));

            return(response.IsSuccessStatusCode);
        }
예제 #6
0
        private TaskStateModel ParseTaskStates(MySqlDataReader reader)
        {
            var states = new TaskStateModel();

            states.id    = (int)reader["id"];
            states.state = (string)reader["state"];
            return(states);
        }
예제 #7
0
        public async Task <IActionResult> Update([FromBody] TaskStateModel taskStateModel)
        {
            var rowsAffected = await _taskRepository.UpdateTaskState(taskStateModel);

            if (rowsAffected == 0)
            {
                return(BadRequest());
            }
            return(Ok());
        }
예제 #8
0
        public async Task <IActionResult> Update([FromBody] TaskStateModel solve, int id)
        {
            var data = taskService.GetTaskAsync(id);

            if (data == null)
            {
                return(NotFound());
            }

            taskService.UpdateTaskAsync(solve.State, id);
            var todoList = await taskService.GetAllTaskAsync();

            return(Ok(todoList));
        }
예제 #9
0
        private void OnCompletedEventHandler(object sender, RunningTaskEventArg eventArg)
        {
            IRunningTask currentTask = (IRunningTask)sender;

            currentTask.OnCompletedEventHandler -= OnCompletedEventHandler;

            TaskStates taskState;
            Int64      taskId = currentTask.TaskModel.Id;

            switch (eventArg)
            {
            case RunningTaskEventArg.Completed:
                logger.WriteTrace("The task has been completed: {0}", taskId);
                taskState = TaskStates.Successed;
                break;

            case RunningTaskEventArg.Cancelled:
                logger.WriteTrace("The task has been canceled: {0}", taskId);
                taskState = TaskStates.Cancelled;
                break;

            case RunningTaskEventArg.Failed:
                logger.WriteTrace("The task has been failed: {0}", taskId);
                taskState = TaskStates.Failed;
                break;

            default:
                throw new NotImplementedException();
            }

            if (taskState == TaskStates.Successed || taskState == TaskStates.Cancelled)
            {
                lock (activeTasks)
                {
                    if (activeTasks.ContainsKey(taskId) == false)
                    {
                        return;
                    }
                    activeTasks.Remove(taskId);
                }

                TaskStateModel taskStateModel = new TaskStateModel(taskId, currentTask.TaskModel.QueueId, currentTask.TaskModel.ServerId, taskState);
                taskDataContext.SetTaskState(taskStateModel);
            }
            else
            {
                //TODO: correct message and details.
                RestartTask(currentTask.TaskModel, "Exception inside", new Exception("TODO"));
            }
        }
예제 #10
0
        public async Task <int> UpdateTaskState(TaskStateModel model)
        {
            int rows;

            using (var cnn = DbConnection)
            {
                var procedure = "[RemoveTaskState]";
                var values    = new
                {
                    model.ID,
                    model.NewTaskState,
                    model.DateTime,
                    model.Editor
                };
                rows = await cnn.ExecuteAsync(procedure, values, commandType : CommandType.StoredProcedure);
            }
            return(rows);
        }
예제 #11
0
        public List <TaskStateModel> GetStates()
        {
            List <TaskState> deserialized = new List <TaskState>();
            string           baseUrl      = ConfigurationManager.ConnectionStrings["ManagementServerName"].ConnectionString;
            string           url          = baseUrl + DestinationNames.GetStates;

            deserialized = Utils.Functionals.Communicator.GetEntities <TaskState>(url);
            List <TaskStateModel> states = new List <TaskStateModel>();

            foreach (var item in deserialized)
            {
                TaskStateModel state = new TaskStateModel();
                state.Id   = item.Id;
                state.Name = item.Name;
                states.Add(state);
            }
            return(states);
        }
예제 #12
0
        /// <summary>
        /// Set task's state.
        /// </summary>
        /// <param name="taskStateModel">The <see cref="WiseQueue.Core.Common.Models.Tasks.TaskStateModel"/> instance.</param>
        public void SetTaskState(TaskStateModel taskStateModel)
        {
            const string updateStatement = "UPDATE {0}.{1} SET [State]={2}, [CompletedAt]=GETUTCDATE() WHERE [Id] = {3} AND [QueueId] = {4} AND [ServerId] = {5}";

            string sqlCommand = string.Format(updateStatement, sqlSettings.WiseQueueDefaultSchema, taskTableName, (short)taskStateModel.TaskState, taskStateModel.Id, taskStateModel.QueueId, taskStateModel.ServerId);

            using (IDbConnection connection = connectionFactory.CreateConnection())
            {
                //TODO: Transaction ???
                using (IDbTransaction transaction = connection.BeginTransaction(IsolationLevel.Serializable))
                {
                    using (IDbCommand command = connectionFactory.CreateCommand(connection))
                    {
                        command.CommandText = sqlCommand;
                        command.ExecuteNonQuery();
                        transaction.Commit();
                    }
                }
            }
        }