private static async Task ExecuteJobAsync(string id, IScheduledJob job, ILogger logger, bool tracingEnabled) { Stopwatch sw = tracingEnabled ? new Stopwatch() : null; try { sw?.Start(); await job.ExecuteAsync(); sw?.Stop(); if (tracingEnabled) { logger?.WriteInformation($"Job(Id: {id} , DisplayName: {job.DisplayName})已执行,耗时:{sw.ElapsedMilliseconds} 毫秒。"); } } catch (Exception ex) { sw?.Stop(); logger?.WriteError($"Job(Id: {id} , DisplayName: {job.DisplayName})执行作业时发生错误。", ex); ex.ThrowIfNecessary(); } finally { IDisposable disposable = job as IDisposable; disposable?.Dispose(); } }
private async Task RunAsync(CancellationToken cancellationToken) { while (!cancellationToken.IsCancellationRequested) { Log.Verbose("Checking for scheduled jobs in the earn jobs queue..."); try { CloudQueueMessage message = await azureQueue.DequeueMessageAsync().ConfigureAwait(false); if (message != null) { string messageInfo = message.AsString; await azureQueue.DeleteMessageAsync(message.Id, message.PopReceipt).ConfigureAwait(false); XDocument xDoc = XDocument.Parse(messageInfo); var messageEement = xDoc.Descendants().FirstOrDefault(d => d.Name == "Message"); if (messageEement != null) { ScheduledJobInfo scheduledJobInfo = JsonConvert.DeserializeObject <ScheduledJobInfo>(messageEement.Value); Log.Info("JobType {0} found in the queue", scheduledJobInfo.JobType.ToString()); IScheduledJob scheduledJob = JobManager.GetJobByType(scheduledJobInfo.JobType); JobManager.DeleteJob(scheduledJobInfo.JobId); Log.Info($"Deleted the azure scheduler job {scheduledJobInfo.JobId}"); var executeAsync = scheduledJob?.ExecuteAsync(scheduledJobInfo); if (executeAsync != null) { await executeAsync; } Log.Info("Finished executing the earn job : {0}", scheduledJobInfo.ToString()); } else { Log.Error("Invalid Payload in the job message : {0}", messageInfo); } } else { Log.Info("No job found in the earn jobs queue..."); } } catch (Exception exception) { Log.Error(exception, "Error in processing the earn job"); } await Task.Delay(TimeSpan.FromSeconds(30)); } }