public async Task <ProcessingTaskQueueMessage> EnqueueConversionTaskAsync(ProcessingTask task) { var msg = new ProcessingTaskQueueMessage { Id = Guid.NewGuid().ToString(), PopReceipt = "", Task = task }; MockWebApi.QueueMessages.Enqueue(msg); return(msg); }
public async Task DoWorkAsync() { ProcessingTaskQueueMessage msg = await _queueService.DequeueConversionTaskAsync(); if (null == msg) { return; } ProcessingTask task = await _taskService.GetTaskAsync(msg.Task.Id); if (null == task || null == task.SourceFile || string.IsNullOrWhiteSpace(task.SourceFile.BlobFileName)) { return; } IFileProcessor fileProcessor = _fileProcessors[task.Operation]; if (null == fileProcessor) { return; } Trace.TraceInformation("Обрабатываем задание {0}", JsonConvert.SerializeObject(msg.Task)); var sourceStream = await _fileStorageService.GetSourceFileStreamAsync(task.SourceFile.BlobFileName); var destinationStream = new MemoryStream((int)sourceStream.Length); // плохо, но не хочется делать файлы await fileProcessor.ProcessFileAsync(sourceStream, destinationStream); destinationStream.Seek(0, SeekOrigin.Begin); var destinationFile = await _fileStorageService.SaveDestinationFileStreamAsync(destinationStream, task.SourceFile.MimeContentType); destinationStream.Close(); task.DestinationFile = destinationFile; task.Status = TaskStatus.Success; task.Message = "Task Processed Succesfully"; await _taskService.SaveTaskAsync(task); await _queueService.DeleteConversionTaskAsync(msg.Id, msg.PopReceipt); Trace.TraceInformation("Задание обработано успешно"); }
public async Task <ProcessingTaskQueueMessage> DequeueConversionTaskAsync() { ConfigurationOptions options = await _configuration.GetApplicationConfigurationAsync(); CloudQueue queue = await getQueueReferenceAsync(options); CloudQueueMessage msg = await queue.GetMessageAsync(); if (null == msg) { return(null); } var task = JsonConvert.DeserializeObject <ProcessingTask>(msg.AsString); var result = new ProcessingTaskQueueMessage { Id = msg.Id, PopReceipt = msg.PopReceipt, Task = task }; return(result); }
public async Task <HttpResponseMessage> Post() { Trace.TraceInformation(this.CreateLogEntry("Receiving a file")); if (!Request.Content.IsMimeMultipartContent()) { return(Request.CreateResponse(HttpStatusCode.BadRequest)); } string operation = null; HttpContent filePart = null; MultipartMemoryStreamProvider bodyParts = await Request.Content.ReadAsMultipartAsync(); ProcessingTask task = null; foreach (HttpContent part in bodyParts.Contents) { var contentDisposition = part.Headers.ContentDisposition; if (contentDisposition == null || string.IsNullOrWhiteSpace(contentDisposition.Name)) { continue; } string partName = contentDisposition.Name.Trim(new[] { ' ', '\t', '\"', '\'' }); if (string.Equals(partName, "operation", StringComparison.OrdinalIgnoreCase)) { operation = await part.ReadAsStringAsync(); } else if (null != part.Headers.ContentType && string.Equals(partName, "file", StringComparison.OrdinalIgnoreCase)) { filePart = part; } if (!string.IsNullOrWhiteSpace(operation) && null != filePart) { break; } } if (string.IsNullOrWhiteSpace(operation) || null == filePart) { return(Request.CreateResponse(HttpStatusCode.BadRequest)); } string contentType = filePart.Headers.ContentType.MediaType; string fileName = filePart.Headers.ContentDisposition.FileName; fileName = fileName.Trim(new[] { ' ', '\t', '\"', '\'' }); FileMetadata fileMetadata = null; using (Stream requestStream = await filePart.ReadAsStreamAsync()) { fileMetadata = await _fileStorageService .SaveSourceFileStreamAsync(requestStream, contentType); } task = new ProcessingTask { Status = TaskStatus.Created, UserId = "*****@*****.**", // аутентификация - не в этом демо Id = Guid.NewGuid().ToShortString(), OriginalFileName = fileName, Operation = operation, Message = "Created processing task", SourceFile = fileMetadata }; // создали задачу await _taskService.SaveTaskAsync(task); // поставили ссылку в очередь ProcessingTaskQueueMessage msg = await _queueService.EnqueueConversionTaskAsync(task); task.Status = TaskStatus.Enqueued; task.Message = "Enqueued task for processing"; // изменили статус задачи await _taskService.SaveTaskAsync(task); return(Request.CreateResponse(HttpStatusCode.OK, task)); }