示例#1
0
        public async Task <ProcessingTaskQueueMessage> EnqueueConversionTaskAsync(ProcessingTask task)
        {
            var msg = new ProcessingTaskQueueMessage
            {
                Id         = Guid.NewGuid().ToString(),
                PopReceipt = "",
                Task       = task
            };

            MockWebApi.QueueMessages.Enqueue(msg);
            return(msg);
        }
示例#2
0
        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("Задание  обработано успешно");
        }
示例#3
0
        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);
        }
示例#4
0
        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));
        }