Пример #1
0
        private List <QueueMetadata> RunTask(QueueMetadata metadata, Task task)
        {
            List <QueueMetadata> result = null;

            JObject metadataJson       = JObject.FromObject(metadata);
            JObject taskpropertiesJson = JUST.JsonTransformer.Transform((JObject)task.TaskProperties.DeepClone(), metadataJson);

            JObject taskProperties = taskpropertiesJson;
            string  identifier     = task.Identifier;

            if (task.Type == TaskType.Splitter)
            {
                result = Splitter.RunTask(metadata, taskProperties, identifier);
            }
            else if (task.Type == TaskType.Transformer)
            {
                result = Transformer.RunTask(metadata, taskProperties, identifier, _orchestration);
            }
            else
            {
                result = RESTConnector.RunTask(metadata, taskProperties, identifier);
            }

            return(result);
        }
Пример #2
0
        /// <summary>
        /// Returns information about the connected queue
        /// </summary>
        /// <returns></returns>
        public QueueMetadata GetQueueInfo()
        {
            var count = RabbitMQHelper.UseConnectionWithRetries(c => c.MessageCount(_queueName), _channel);

            if (count > int.MaxValue)
            {
                // This scenario seems unlikely enough that I don't feel like coding around it. Are we ever going to have queues
                // with more than two billion messages at a time? We can cross that bridge when we come to it
                throw new InvalidOperationException("Count of messages in the queue is greater than a 32bit signed integer.");
            }
            var result = new QueueMetadata((int)count, _queueName);

            return(result);
        }
Пример #3
0
        public async Task <IActionResult> Upload(List <IFormFile> files)
        {
            var response = new UploadResponse {
                Success = true
            };

            this.Response.StatusCode = (int)HttpStatusCode.OK;

            string operationId = System.Diagnostics.Activity.Current?.RootId ?? "Could not pull Operation Id";

            foreach (var formFile in files)
            {
                var uploadSuccess = false;

                if (formFile.Length > 0)
                {
                    string remoteFilePath = null;

                    using (var stream = formFile.OpenReadStream())
                    {
                        (uploadSuccess, remoteFilePath) = await this.cloudProvider.StorageProvider().UploadFile(formFile.FileName, stream);

                        var metadata = new QueueMetadata {
                            Fileuri = remoteFilePath, OperationId = operationId
                        };

                        uploadSuccess = uploadSuccess && await this.cloudProvider.QueueProvider().Enqueue(metadata);
                    }
                }

                this.LogFileUploadStatistics(formFile, operationId, uploadSuccess);

                if (uploadSuccess == false)
                {
                    response.Success = false;
                    break;
                }
            }

            if (response.Success == false)
            {
                this.Response.StatusCode = (int)HttpStatusCode.BadRequest;
            }

            return(this.Json(response));
        }
Пример #4
0
 private void PublishToQueue(Models.Queue currentQueue, QueueMetadata currentMetadata, QueueMetadata result, string runTask, bool workflowCompleted,
                             bool active)
 {
     if (result == null)
     {
         _orchestration.PublishWorkflowStep(currentQueue.Type.Name, currentQueue.WorkflowID, null, null,
                                            runTask, true, workflowCompleted, 0, active, runTask, null);
     }
     else
     {
         if (result.Success)
         {
             _orchestration.PublishWorkflowStep(currentQueue.Type.Name, currentQueue.WorkflowID, result.MessageBodyJson, result.CustomPropertiesJson,
                                                runTask, true, workflowCompleted, 0, active, runTask, result.SplitID);
         }
         else
         {
             _orchestration.PublishWorkflowStep(currentQueue.Type.Name, currentQueue.WorkflowID, currentMetadata.MessageBodyJson, result.CustomPropertiesJson,
                                                currentMetadata.StepIdentifier, false, workflowCompleted, currentMetadata.Retries + 1, active, runTask, currentMetadata.SplitID);
         }
     }
 }
Пример #5
0
        /// <summary>
        /// Assertions in this method are based on MessageProcessor which picks
        /// up an item from the queue and writes a file back to storage
        /// </summary>
        /// <param name="times">number of times to retry</param>
        /// <returns>If queue item was processed</returns>
        private async Task <bool> MessageIsProcessedInQueueAsync(int times)
        {
            HttpResponseMessage response;
            int attempts;

            (response, attempts) = await this.Retry(times, new TimeSpan(5 * TimeSpan.TicksPerSecond), this.DownloadQueueResponseAsync);

            if (response == null)
            {
                return(false);
            }

            var actual = await this.ExtractResponseContent(response);

            QueueMetadata data = JsonConvert.DeserializeObject <QueueMetadata>(actual);

            if (data == null)
            {
                return(false);
            }

            Console.WriteLine("Queue message proccessed after {0} retries", attempts);
            return(!string.IsNullOrEmpty(data.Fileuri));
        }
 public void BecauseOf()
 {
     var queueMetadata = new[]
                             {
                                 new QueueMetadataNameValuePair {Name = "test1", Value = "value1"},
                                 new QueueMetadataNameValuePair {Name = "test2", Value = "value2"},
         };
     _azureQueueService.PutQueueMetadata(_queueUri, queueMetadata);
     _queueMetadata = _azureQueueService.GetQueueMetadata(_queueUri);
 }
 public void BecauseOf()
 {
     _queueMetadata = _azureQueueService.GetQueueMetadata(_queueUri);
 }
Пример #8
0
        public static List <QueueMetadata> RunTask(QueueMetadata metadata, JObject taskProperties, string identifier, IOrchestration orchestration)
        {
            List <QueueMetadata> result = null;

            try
            {
                if (taskProperties == null)
                {
                    throw new Exception("TaskProperties for Transformer cannot be NULL");
                }

                TransformerConfiguration taskConfig = taskProperties.ToObject <TransformerConfiguration>();
                JObject transformerJson             = orchestration.GetTransformer(taskConfig.TransformerID);


                QueueMetadata transformedMetadata = new QueueMetadata()
                {
                    CustomPropertiesJson = metadata.CustomPropertiesJson,
                    ID = Guid.NewGuid(),
                    MessageBodyJson = metadata.MessageBodyJson,
                    Retries         = metadata.Retries,
                    SplitID         = metadata.SplitID,
                    StepIdentifier  = identifier,
                    Success         = true,
                    Timestamp       = DateTime.UtcNow
                };

                transformedMetadata.MessageBodyJson = JUST.JsonTransformer.Transform(transformerJson, metadata.MessageBodyJson);
                result = new List <QueueMetadata>();
                result.Add(transformedMetadata);
            }
            catch (Exception ex)
            {
                result = new List <QueueMetadata>();
                QueueMetadata errorMetaData = new QueueMetadata()
                {
                    CustomPropertiesJson = metadata.CustomPropertiesJson,
                    ID = Guid.NewGuid(),
                    MessageBodyJson = metadata.MessageBodyJson,
                    Retries         = metadata.Retries,
                    SplitID         = metadata.SplitID,
                    StepIdentifier  = identifier,
                    Success         = false,
                    Timestamp       = DateTime.UtcNow
                };

                Dictionary <string, string> customPropertiesSerialized = errorMetaData.CustomPropertiesJson.ToObject <Dictionary <string, string> >();
                if (customPropertiesSerialized.ContainsKey("Error"))
                {
                    customPropertiesSerialized.Remove("Error");
                }

                customPropertiesSerialized.Add("Error", ex.Message);

                errorMetaData.CustomPropertiesJson = JObject.FromObject(customPropertiesSerialized);

                result.Add(errorMetaData);
            }


            return(result);
        }
Пример #9
0
        public static List <QueueMetadata> RunTask(QueueMetadata metadata, JObject taskProperties, string identifier)
        {
            List <QueueMetadata> result = null;

            try
            {
                if (taskProperties == null)
                {
                    throw new Exception("TaskProperties for Splitter cannot be NULL");
                }

                SplitterConfiguration taskConfig = taskProperties.ToObject <SplitterConfiguration>();

                IEnumerable <JObject> messages = JUST.JsonTransformer.SplitJson(metadata.MessageBodyJson, taskConfig.ArrayPath);

                result = new List <QueueMetadata>();

                int i = 0;
                foreach (JObject message in messages)
                {
                    QueueMetadata splitMetadata = new QueueMetadata()
                    {
                        CustomPropertiesJson = metadata.CustomPropertiesJson,
                        ID = Guid.NewGuid(),
                        MessageBodyJson = message,
                        Retries         = metadata.Retries,
                        SplitID         = metadata.SplitID + "." + i.ToString(),
                        StepIdentifier  = identifier,
                        Success         = true,
                        Timestamp       = DateTime.UtcNow
                    };
                    i++;
                    result.Add(splitMetadata);
                }
            }
            catch (Exception ex)
            {
                result = new List <QueueMetadata>();
                QueueMetadata errorMetaData = new QueueMetadata()
                {
                    CustomPropertiesJson = metadata.CustomPropertiesJson,
                    ID = Guid.NewGuid(),
                    MessageBodyJson = metadata.MessageBodyJson,
                    Retries         = metadata.Retries,
                    SplitID         = metadata.SplitID,
                    StepIdentifier  = identifier,
                    Success         = false,
                    Timestamp       = DateTime.UtcNow
                };

                Dictionary <string, string> customPropertiesSerialized = errorMetaData.CustomPropertiesJson.ToObject <Dictionary <string, string> >();
                if (customPropertiesSerialized.ContainsKey("Error"))
                {
                    customPropertiesSerialized.Remove("Error");
                }

                customPropertiesSerialized.Add("Error", ex.Message);

                errorMetaData.CustomPropertiesJson = JObject.FromObject(customPropertiesSerialized);

                result.Add(errorMetaData);
            }

            return(result);
        }
Пример #10
0
        public static List <QueueMetadata> RunTask(QueueMetadata metadata, JObject taskProperties, string identifier)
        {
            List <QueueMetadata> result = null;

            try
            {
                if (taskProperties == null)
                {
                    throw new Exception("TaskProperties for Transformer cannot be NULL");
                }

                RESTConfig taskConfig = taskProperties.ToObject <RESTConfig>();

                QueueMetadata newMetadata = new QueueMetadata()
                {
                    CustomPropertiesJson = metadata.CustomPropertiesJson,
                    ID = Guid.NewGuid(),
                    MessageBodyJson = metadata.MessageBodyJson,
                    Retries         = metadata.Retries,
                    SplitID         = metadata.SplitID,
                    StepIdentifier  = identifier,
                    Success         = true,
                    Timestamp       = DateTime.UtcNow
                };

                HttpClient client = new HttpClient();
                client.BaseAddress = new Uri(taskConfig.Url);

                if (taskConfig.Headers != null)
                {
                    foreach (KeyValuePair <string, string> header in taskConfig.Headers)
                    {
                        client.DefaultRequestHeaders.TryAddWithoutValidation(header.Key, header.Value);
                    }
                }
                client.DefaultRequestHeaders.Accept.Clear();
                client.DefaultRequestHeaders.Accept.Add(new System.Net.Http.Headers.MediaTypeWithQualityHeaderValue("application/json"));
                HttpContent content = new StringContent(JsonConvert.SerializeObject(taskConfig.Body), Encoding.UTF8, "application/json");

                Task <HttpResponseMessage> response = null;

                if (taskConfig.Method.ToLower() == "get")
                {
                    response = client.GetAsync(taskConfig.QueryString);
                }
                else if (taskConfig.Method.ToLower() == "put")
                {
                    response = client.PutAsync(taskConfig.QueryString, content);
                }
                else if (taskConfig.Method.ToLower() == "post")
                {
                    response = client.PostAsync(taskConfig.QueryString, content);
                }
                else if (taskConfig.Method.ToLower() == "delete")
                {
                    response = client.DeleteAsync(taskConfig.QueryString);
                }
                else
                {
                    throw new Exception("Method : " + taskConfig.Method + " not implemented in RESTConnector.");
                }

                response.Wait();

                if (response.Result.IsSuccessStatusCode)
                {
                    Task <string> resultString = response.Result.Content.ReadAsStringAsync();
                    resultString.Wait();

                    JObject jObj = metadata.MessageBodyJson;

                    try
                    {
                        JObject token = JObject.Parse(resultString.Result);

                        JProperty property = jObj.Property(identifier);
                        if (property == null)
                        {
                            jObj.Add(new JProperty(identifier, token));
                        }
                    }
                    catch (JsonReaderException ex)
                    {
                        JProperty property = jObj.Property(identifier);
                        if (property == null)
                        {
                            jObj.Add(new JProperty(identifier, resultString.Result));
                        }
                    }


                    newMetadata.MessageBodyJson = jObj;
                }
                else
                {
                    throw new Exception("Response from RESTService : " + response.Result.StatusCode.ToString() + " : " + response.Result.ReasonPhrase);
                }

                result = new List <QueueMetadata>();
                result.Add(newMetadata);
            }
            catch (Exception ex)
            {
                result = new List <QueueMetadata>();
                QueueMetadata errorMetaData = new QueueMetadata()
                {
                    CustomPropertiesJson = metadata.CustomPropertiesJson,
                    ID = Guid.NewGuid(),
                    MessageBodyJson = metadata.MessageBodyJson,
                    Retries         = metadata.Retries,
                    SplitID         = metadata.SplitID,
                    StepIdentifier  = identifier,
                    Success         = false,
                    Timestamp       = DateTime.UtcNow
                };

                Dictionary <string, string> customPropertiesSerialized = errorMetaData.CustomPropertiesJson.ToObject <Dictionary <string, string> >();
                if (customPropertiesSerialized.ContainsKey("Error"))
                {
                    customPropertiesSerialized.Remove("Error");
                }

                customPropertiesSerialized.Add("Error", ex.Message);

                errorMetaData.CustomPropertiesJson = JObject.FromObject(customPropertiesSerialized);

                result.Add(errorMetaData);
            }


            return(result);
        }
Пример #11
0
 /// <summary>
 /// Processes item by writing a new file
 /// </summary>
 /// <param name="item">Queue item</param>
 /// <returns>Async task</returns>
 internal async Task Process(QueueMetadata item)
 {
     await this.cloud.StorageProvider().UploadFile(
         Constants.NotifyFilename,
         new MemoryStream(Encoding.ASCII.GetBytes(JsonConvert.SerializeObject(item))));
 }
Пример #12
0
        public List <Queue> Enqueue()
        {
            string tableName = Constants.QueueTableName;
            Table  table     = Table.LoadTable(_client, tableName);

            ScanFilter scanFilter = new ScanFilter();

            scanFilter.AddCondition(Constants.QueueActive, ScanOperator.Equal, "True");

            Search search = table.Scan(scanFilter);

            List <Queue> list = new List <Queue>();

            string  queueID              = null;
            JObject businessLogicJson    = null;
            string  workflowTypeName     = null;
            Guid    workflowID           = Guid.Empty;
            JObject customPropertiesJson = null;
            JObject messageBodyJson      = null;

            string stepIdentifier = null;
            bool   stepSucceeded  = true;

            int retries = 0;

            DateTime timeStamp         = DateTime.UtcNow;
            string   runStepIdentifier = null;
            string   splitID           = null;

            do
            {
                Task <List <Document> > documentListTask = search.GetNextSetAsync();
                documentListTask.Wait();

                List <Document> documentList = documentListTask.Result;

                foreach (Document document in documentList)
                {
                    queueID           = document[Constants.QueueId].AsString();
                    businessLogicJson = JObject.Parse(document[Constants.BusinessLogic].AsDocument().ToJson());
                    workflowTypeName  = document[Constants.WorkflowType].AsString();
                    workflowID        = document[Constants.HistoryWorkflowId].AsGuid();

                    if (document.ContainsKey(Constants.QueueCustomProperties))
                    {
                        customPropertiesJson = JObject.Parse(document[Constants.QueueCustomProperties].AsDocument().ToJson());
                    }

                    if (document.ContainsKey(Constants.QueueMessageBody))
                    {
                        messageBodyJson = JObject.Parse(document[Constants.QueueMessageBody].AsDocument().ToJson());
                    }

                    if (document.ContainsKey(Constants.QueueStepIdentifier))
                    {
                        stepIdentifier = document[Constants.QueueStepIdentifier].AsString();
                    }

                    if (document.ContainsKey(Constants.QueueRunStepIdentifier))
                    {
                        runStepIdentifier = document[Constants.QueueRunStepIdentifier].AsString();
                    }

                    if (document.ContainsKey(Constants.QueueSlitID))
                    {
                        splitID = document[Constants.QueueSlitID].AsString();
                    }

                    if (document.ContainsKey(Constants.QueueRetries))
                    {
                        retries = document[Constants.QueueRetries].AsInt();
                    }

                    if (document.ContainsKey(Constants.QueueStepSucceeded))
                    {
                        stepSucceeded = document[Constants.QueueStepSucceeded].AsBoolean();
                    }

                    if (document.ContainsKey(Constants.Timestamp))
                    {
                        timeStamp = Convert.ToDateTime(document[Constants.Timestamp].AsString());
                    }

                    QueueMetadata metadata = new QueueMetadata()
                    {
                        CustomPropertiesJson = customPropertiesJson,
                        ID = Guid.Parse(queueID),
                        MessageBodyJson = messageBodyJson,
                        SplitID         = splitID,
                        StepIdentifier  = stepIdentifier,
                        Success         = stepSucceeded,
                        Retries         = retries,
                        Timestamp       = timeStamp
                    };

                    Queue queue = GetQueueByWorkflowID(list, workflowID.ToString());

                    if (queue == null)
                    {
                        queue = new Queue()
                        {
                            Type = new WorkfowType()
                            {
                                BusinessLogicJson = businessLogicJson,
                                Name = workflowTypeName
                            },
                            WorkflowID = workflowID,
                            Metadata   = new List <QueueMetadata>()
                        }
                    }
                    ;

                    queue.Metadata.Add(metadata);

                    list.Add(queue);
                    DeleteFromQueue(queueID, true);
                }
            } while (!search.IsDone);

            return(list);
        }
Пример #13
0
        public List <Queue> Enqueue()
        {
            List <Queue> instance = null;

            MySqlConnection connection = null;

            try
            {
                connection = new MySqlConnection(_connectionString);

                MySqlCommand command = new MySqlCommand("Orchestration_Enqueue", connection);
                command.CommandType = CommandType.StoredProcedure;

                connection.Open();

                MySqlDataReader reader = command.ExecuteReader();

                Queue queue = null;
                while (reader.Read())
                {
                    if (instance == null)
                    {
                        instance = new List <Queue>();
                    }

                    string workflowID = reader.GetString("idWorkflow");

                    if (queue == null || queue.WorkflowID == null || queue.WorkflowID.ToString().ToLower() != workflowID.ToLower())
                    {
                        if (queue != null)
                        {
                            instance.Add(queue);
                        }

                        queue            = new Queue();
                        queue.WorkflowID = Guid.Parse(workflowID);
                        queue.Type       = new WorkfowType()
                        {
                            ID   = reader.GetInt32("idWorkflowType"),
                            Name = reader.GetString("WorkflowTypeName"),
                            BusinessLogicJson = JObject.Parse(reader.GetString("BusinessLogic"))
                        };
                        queue.Metadata = new List <QueueMetadata>();
                    }

                    QueueMetadata queueMetadata = new QueueMetadata()
                    {
                        CustomPropertiesJson = !reader.IsDBNull(3) ? JObject.Parse(reader.GetString(3)) : null,
                        ID = reader.GetGuid("QueueID"),
                        MessageBodyJson = !reader.IsDBNull(7) ? JObject.Parse(reader.GetString(7)) : null,
                        Retries         = reader.GetInt32("Retries"),
                        SplitID         = reader.GetString("SplitID"),
                        StepIdentifier  = !reader.IsDBNull(5) ? reader.GetString(5) : null,
                        Success         = reader.GetBoolean("Success"),
                        Timestamp       = reader.GetDateTime("Timestamp")
                    };

                    queue.Metadata.Add(queueMetadata);
                }
                if (instance != null)
                {
                    instance.Add(queue);
                }
            }
            catch (Exception ex)
            {
                throw ex;
            }
            finally
            {
                if (connection.State == ConnectionState.Open)
                {
                    connection.Close();
                }
            }

            return(instance);
        }