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); }
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); }