예제 #1
0
        public static async Task <QueuedTask> ReadQueuedTaskAsync(this NpgsqlDataReader reader)
        {
            string     payloadString;
            QueuedTask queuedTask;

            if (reader == null)
            {
                throw new ArgumentNullException(nameof(reader));
            }

            queuedTask = new QueuedTask();

            queuedTask.Id = await reader.GetFieldValueAsync <Guid>("task_id",
                                                                   defaultValue: Guid.Empty);

            queuedTask.LockHandleId = await reader.GetFieldValueAsync <long>("task_lock_handle_id",
                                                                             defaultValue : 0);

            queuedTask.Priority = await reader.GetFieldValueAsync <int>("task_priority",
                                                                        defaultValue : 0);

            queuedTask.Type = await reader.GetFieldValueAsync <string>("task_type",
                                                                       defaultValue : string.Empty);

            queuedTask.Source = await reader.GetFieldValueAsync <string>("task_source",
                                                                         defaultValue : string.Empty);

            //Get payoad
            payloadString = await reader.GetFieldValueAsync <string>("task_payload",
                                                                     defaultValue : string.Empty);

            queuedTask.Payload = payloadString
                                 .AsObjectFromJson();

            queuedTask.PostedAtTs = await reader.GetFieldValueAsync <DateTimeOffset>("task_posted_at_ts",
                                                                                     defaultValue : DateTimeOffset.MinValue);

            queuedTask.LockedUntilTs = await reader.GetFieldValueAsync <DateTimeOffset>("task_locked_until_ts",
                                                                                        defaultValue : DateTimeOffset.MinValue);

            return(queuedTask);
        }
예제 #2
0
        public static async Task <T> GetFieldValueAsync <T> (this NpgsqlDataReader reader, string columnName, T defaultValue)
        {
            if (reader == null)
            {
                throw new ArgumentNullException(nameof(reader));
            }

            if (string.IsNullOrEmpty(columnName))
            {
                throw new ArgumentNullException(nameof(columnName));
            }

            int index = reader.GetOrdinal(columnName);

            if (await reader.IsDBNullAsync(index))
            {
                return(defaultValue);
            }

            return(await reader.GetFieldValueAsync <T>(index));
        }
        public async Task <TaskQueueMetrics> ComputeMetricsAsync()
        {
            long totalUnprocessed = 0,
                 totalProcessing  = 0,
                 totalErrored     = 0,
                 totalFaulted     = 0,
                 totalFataled     = 0,
                 totalProcessed   = 0;

            CheckNotDisposedOrThrow();

            string statsResultsSql = $@"SELECT q.task_status, 
					COUNT(q.task_status) AS task_status_count 
				FROM {mOptions.Mapping.ResultsQueueTableName} AS q 
				GROUP BY q.task_status"                ;

            using (NpgsqlConnection conn = await OpenConnectionAsync())
                using (NpgsqlCommand statsResultsCmd = new NpgsqlCommand(statsResultsSql, conn))
                    using (NpgsqlDataReader statsResultsRdr = await statsResultsCmd.ExecuteReaderAsync())
                    {
                        while (statsResultsRdr.Read())
                        {
                            long count = await statsResultsRdr.GetFieldValueAsync("task_status_count",
                                                                                  defaultValue : 0);

                            QueuedTaskStatus status = ( QueuedTaskStatus )(await statsResultsRdr.GetFieldValueAsync("task_status",
                                                                                                                    defaultValue: 0));

                            switch (status)
                            {
                            case QueuedTaskStatus.Unprocessed:
                                totalUnprocessed = count;
                                break;

                            case QueuedTaskStatus.Processing:
                                totalProcessing = count;
                                break;

                            case QueuedTaskStatus.Error:
                                totalErrored = count;
                                break;

                            case QueuedTaskStatus.Faulted:
                                totalFaulted = count;
                                break;

                            case QueuedTaskStatus.Fatal:
                                totalFataled = count;
                                break;

                            case QueuedTaskStatus.Processed:
                                totalProcessed = count;
                                break;
                            }
                        }

                        await statsResultsRdr.CloseAsync();

                        await conn.CloseAsync();
                    }

            return(new TaskQueueMetrics(totalUnprocessed,
                                        totalProcessing,
                                        totalErrored,
                                        totalFaulted,
                                        totalFataled,
                                        totalProcessed));
        }
        public static async Task <QueuedTaskResult> ReadQueuedTaskResultAsync(this NpgsqlDataReader reader)
        {
            if (reader == null)
            {
                throw new ArgumentNullException(nameof(reader));
            }

            string payloadString,
                   taskErrorString;

            QueuedTaskResult result =
                new QueuedTaskResult();

            result.Id = await reader.GetFieldValueAsync <Guid>("task_id",
                                                               defaultValue : Guid.Empty);

            result.Type = await reader.GetFieldValueAsync <string>("task_type",
                                                                   defaultValue : string.Empty);

            result.Source = await reader.GetFieldValueAsync <string>("task_source",
                                                                     defaultValue : string.Empty);

            result.Status = ( QueuedTaskStatus )(await reader.GetFieldValueAsync <int>("task_status",
                                                                                       defaultValue: 0));
            result.Priority = await reader.GetFieldValueAsync <int>("task_priority",
                                                                    defaultValue : 0);

            result.LastErrorIsRecoverable = await reader.GetFieldValueAsync <bool>("task_last_error_is_recoverable",
                                                                                   defaultValue : false);

            result.ErrorCount = await reader.GetFieldValueAsync <int>("task_error_count",
                                                                      defaultValue : 0);

            //Get payoad
            payloadString = await reader.GetFieldValueAsync <string>("task_payload",
                                                                     defaultValue : string.Empty);

            result.Payload = payloadString
                             .AsObjectFromJson();

            //Get last task error
            taskErrorString = await reader.GetFieldValueAsync <string>("task_last_error",
                                                                       defaultValue : string.Empty);

            result.LastError = taskErrorString
                               .AsObjectFromJson <QueuedTaskError>();

            result.PostedAtTs = await reader.GetFieldValueAsync <DateTimeOffset>("task_posted_at_ts",
                                                                                 defaultValue : DateTimeOffset.MinValue);

            result.ProcessingTimeMilliseconds = await reader.GetFieldValueAsync <long>("task_processing_time_milliseconds",
                                                                                       defaultValue : 0);

            result.FirstProcessingAttemptedAtTs = await reader.GetNullableFieldValueAsync <DateTimeOffset>("task_first_processing_attempted_at_ts",
                                                                                                           defaultValue : null);

            result.LastProcessingAttemptedAtTs = await reader.GetNullableFieldValueAsync <DateTimeOffset>("task_last_processing_attempted_at_ts",
                                                                                                          defaultValue : null);

            result.ProcessingFinalizedAtTs = await reader.GetNullableFieldValueAsync <DateTimeOffset>("task_processing_finalized_at_ts",
                                                                                                      defaultValue : null);

            return(result);
        }