示例#1
0
        ///-------------------------------------------------------------------------------------------------
        /// <summary>   Gets an one. </summary>
        ///
        /// <param name="id">   The identifier. </param>
        ///
        /// <returns>   The one. </returns>
        ///-------------------------------------------------------------------------------------------------
        public async Task <Core.Models.Projections.Interfaces.IOrionTaskDto> GetOne(long id)
        {
            //wire up db context, call to get task
            var task = await Task.FromResult(new OrionTask());

            var taskDto = _taskConverter.Convert(task);

            return(taskDto);
        }
示例#2
0
        /// <summary>
        /// Insert a task into the storage.
        /// </summary>
        /// <param name="taskModel">The <see cref="TaskModel"/> instance.</param>
        /// <returns>The task's identifier.</returns>
        /// <exception cref="ArgumentException">Task's identifier should be 0.</exception>
        public Int64 InsertTask(TaskModel taskModel)
        {
            logger.WriteTrace("Inserting {0} into the database...", taskModel);

            if (taskModel.Id != 0)
            {
                throw new ArgumentException("Task's identifier should be 0. Now it is " + taskModel.Id, "taskModel");
            }

            logger.WriteTrace("Converting {0} into the TaskEntity...", taskModel);
            TaskEntity taskEntity = taskConverter.Convert(taskModel);

            logger.WriteTrace("{0} has been converted. Generating sql command for {1}...", taskModel, taskEntity);

            string instanceType    = taskEntity.InstanceType;
            string method          = taskEntity.Method;
            string parametersTypes = taskEntity.ParametersTypes;
            string arguments       = taskEntity.Arguments;
            Int64  queueId         = taskEntity.QueueId;
            string sqlCommand      = string.Format(insertStatement, sqlSettings.WiseQueueDefaultSchema, taskTableName, (short)taskEntity.TaskState, instanceType, method, parametersTypes, arguments, queueId);

            logger.WriteTrace("The SqlCommand has been generated. Result: {0}", sqlCommand);

            logger.WriteTrace("Executing sql command...");
            using (IDbConnection connection = connectionFactory.CreateConnection())
            {
                using (IDbCommand command = connectionFactory.CreateCommand(connection))
                {
                    command.CommandText = sqlCommand;
                    Int64 taskId = (Int64)command.ExecuteScalar();

                    logger.WriteTrace("The command has been executed. TaskId = {0}", taskId);
                    return(taskId);
                }
            }
        }
        /// <summary>
        /// Get available task from the storage.
        /// </summary>
        /// <param name="specification">The <see cref="TaskRequestSpecification"/> instance.</param>
        /// <param name="taskModels">List of <see cref="WiseQueue.Core.Common.Models.Tasks.TaskStateModel"/> instances if it has been found</param>
        /// <returns>True if the list of TaskModel instances has been populated. Otherwise, false.</returns>
        public bool TryGetAvailableTask(TaskRequestSpecification specification, out List <TaskModel> taskModels)
        {
            if (specification == null)
            {
                throw new ArgumentNullException("specification");
            }

            StringBuilder stringBuilder = new StringBuilder();

            stringBuilder.Append("Declare @TempTable table ([Id] [bigint], ");
            stringBuilder.Append("[QueueId] [bigint], ");
            stringBuilder.Append("[ServerId] [bigint] NULL, ");
            stringBuilder.Append("[State] [smallint], ");
            stringBuilder.Append("[CompletedAt] [datetime] NULL, ");
            stringBuilder.Append("[ExecuteAt] [datetime] NOT NULL, ");
            stringBuilder.Append("[RepeatCrashCount] [int] NOT NULL, ");
            stringBuilder.Append("[InstanceType] [nvarchar](4000), ");
            stringBuilder.Append("[Method] [nvarchar](4000), ");
            stringBuilder.Append("[ParametersTypes] [nvarchar](4000), ");
            stringBuilder.AppendLine("[Arguments] [nvarchar](4000)); ");

            stringBuilder.AppendFormat("UPDATE TOP ({0}) {1}.{2} ", specification.MaxTasks, sqlSettings.WiseQueueDefaultSchema, taskTableName);
            stringBuilder.AppendFormat("SET State = {0}, ", (short)TaskStates.Pending);
            stringBuilder.AppendFormat("ServerId = {0} ", specification.ServerId);
            //stringBuilder.Append("RepeatCount = RepeatCount - 1 ");
            stringBuilder.Append("OUTPUT inserted.* INTO @TempTable ");
            stringBuilder.AppendFormat("Where (State = {0} ", (short)TaskStates.New);
            stringBuilder.AppendFormat("OR ( (State = {0} OR State = {1}) AND [ServerId] IS NULL)) ", (short)TaskStates.Pending, (short)TaskStates.Running);
            stringBuilder.AppendFormat("AND (QueueId = {0}) AND ([ExecuteAt] <= GETUTCDATE()) AND [RepeatCrashCount] > 0;", specification.QueueId);

            stringBuilder.AppendLine();
            stringBuilder.AppendLine("SELECT * FROM @TempTable");

            using (IDbConnection connection = connectionFactory.CreateConnection())
            {
                using (IDbTransaction transaction = connection.BeginTransaction(IsolationLevel.Serializable))
                {
                    using (IDbCommand command = connectionFactory.CreateCommand(connection, transaction))
                    {
                        command.CommandText = stringBuilder.ToString();
                        using (IDataReader rdr = command.ExecuteReader())
                        {
                            taskModels = new List <TaskModel>();
                            while (rdr.Read())
                            {
                                Int64      id        = (Int64)rdr["Id"];
                                Int64      queueId   = (Int64)rdr["QueueId"];
                                Int64      serverId  = (Int64)rdr["ServerId"];
                                TaskStates taskState = (TaskStates)(short)rdr["State"];

                                int repeatCrashCount = (int)rdr["RepeatCrashCount"];

                                string     typeDetails      = (string)rdr["InstanceType"];
                                string     methodDetails    = (string)rdr["Method"];
                                string     parameterDetails = (string)rdr["ParametersTypes"];
                                string     argumentDetails  = (string)rdr["Arguments"];
                                TaskEntity taskEntity       = new TaskEntity
                                {
                                    Id               = id,
                                    QueueId          = queueId,
                                    ServerId         = serverId,
                                    TaskState        = taskState,
                                    InstanceType     = typeDetails,
                                    Method           = methodDetails,
                                    ParametersTypes  = parameterDetails,
                                    Arguments        = argumentDetails,
                                    RepeatCrashCount = repeatCrashCount
                                };

                                TaskModel taskModel = taskConverter.Convert(taskEntity);
                                taskModels.Add(taskModel);
                            }
                        }
                    }
                    if (taskModels.Count > 0)
                    {
                        transaction.Commit();
                        return(true);
                    }
                }

                return(false);
            }
        }