Ejemplo n.º 1
0
        public static void Run([CosmosDBTrigger(
                                    databaseName: "IoT",
                                    collectionName: "IoT",
                                    ConnectionStringSetting = "DBConnection",
                                    LeaseCollectionName = "leases")] IReadOnlyList <Document> documents, TraceWriter log)
        {
            Microsoft.WindowsAzure.Storage.Queue.CloudQueueClient queueClient;
            Microsoft.WindowsAzure.Storage.Queue.CloudQueue       queue;
            Microsoft.WindowsAzure.Storage.CloudStorageAccount    storageAccount = Microsoft.WindowsAzure.Storage.CloudStorageAccount.Parse("DefaultEndpointsProtocol=https;AccountName=scmrstorage;AccountKey=FtW5Qlz/5rWiqX0MPlGO0X2anGs5t7ea/H/ZkdcIEHlTA9isEinpscnuuhw8GwKR+7+Eo2IDRG1jwdMoDsRTqg==;EndpointSuffix=core.windows.net");
            queueClient = storageAccount.CreateCloudQueueClient();
            queue       = queueClient.GetQueueReference("trafficqueue");

            foreach (var doc in documents)
            {
                if (doc.GetPropertyValue <string>("accident") == "true")
                {
                    string m = String.Format("{{ \"lat\": {0}, \"long\": {1}, \"carId\": \"{2}\" }}",
                                             doc.GetPropertyValue <string>("lat"),
                                             doc.GetPropertyValue <string>("longitude"),
                                             doc.GetPropertyValue <string>("carid"));
                    Microsoft.WindowsAzure.Storage.Queue.CloudQueueMessage message = new Microsoft.WindowsAzure.Storage.Queue.CloudQueueMessage
                                                                                         (m);
                    queue.AddMessage(message);
                }
            }
        }
        public static void Run([TimerTrigger("0 */5 * * * *")] TimerInfo myTimer, ILogger log)
        {
            try
            {
                log.LogInformation($"ProcessLandingDataUsingADF Timer trigger function executed at: {DateTime.Now}");

                string cloudAccountName = null;
                string cloudKey         = null;
                string queueName        = "fileevent";

                AzureServiceTokenProvider azureServiceTokenProvider = new AzureServiceTokenProvider();
                KeyVaultClient            keyvaultClient            = new KeyVaultClient(new KeyVaultClient.AuthenticationCallback(azureServiceTokenProvider.KeyVaultTokenCallback));
                string keyVault = Environment.GetEnvironmentVariable("MY_KEY_VAULT");

                var secretCloudAccountName = keyvaultClient.GetSecretAsync($"https://{keyVault}.vault.azure.net/", "LandingZoneStorageAccountName");
                var secretcloudKey         = keyvaultClient.GetSecretAsync($"https://{keyVault}.vault.azure.net/", "LandingZoneStorageAccountKey");

                cloudAccountName = secretCloudAccountName.Result.Value;
                cloudKey         = secretcloudKey.Result.Value;

                Microsoft.WindowsAzure.Storage.Queue.CloudQueue cloudQueue = QueueService.ConnectToQueueStorage(queueName, cloudAccountName, cloudKey);

                Microsoft.WindowsAzure.Storage.Queue.CloudQueueMessage queueItem = QueueService.GetQueueItem(queueName, cloudQueue);

                while (queueItem != null)
                {
                    ProcessItem(queueItem, queueName, cloudQueue, log);
                    queueItem = QueueService.GetQueueItem(queueName, cloudQueue);
                }
            }
            catch (Exception ex)
            {
                log.LogError("ProcessLandingDataUsingADF Exception: " + ex.ToString());
            }
        } // Run
Ejemplo n.º 3
0
        public static void Run([CosmosDBTrigger(
                                    databaseName: "rafat-tweets",
                                    collectionName: "tweets",
                                    ConnectionStringSetting = "DBConnection",
                                    LeaseCollectionName = "leases")] IReadOnlyList <Document> items, TraceWriter log)
        {
            if (_cognitiveSvc == null)
            {
                _cognitiveSvc = new CognitiveSvc("Ocp-Apim-Subscription-Key", "Key");
            }

            //Queue Conneciton
            Microsoft.WindowsAzure.Storage.Queue.CloudQueueClient queueClient;
            Microsoft.WindowsAzure.Storage.Queue.CloudQueue       queue;
            CloudStorageAccount storageAccount = CloudStorageAccount.Parse("DefaultEndpointsProtocol=https;AccountName=scmrstorage;AccountKey=AccountKey;EndpointSuffix=core.windows.net");

            queueClient = storageAccount.CreateCloudQueueClient();
            queue       = queueClient.GetQueueReference("tweetqueue");

            foreach (var doc in items)
            {
                string _post       = doc.GetPropertyValue <string>("Post");
                float  _sentiments = _cognitiveSvc.GetSentiments(_post).Result;
                string m           = String.Format("{{ \"Author\": \"{0}\", \"Post\":\"{1}\", \"Sentiments\": {2} }}",
                                                   doc.GetPropertyValue <string>("Author"),
                                                   _post,
                                                   _sentiments);
                Microsoft.WindowsAzure.Storage.Queue.CloudQueueMessage message =
                    new Microsoft.WindowsAzure.Storage.Queue.CloudQueueMessage(m);
                queue.AddMessage(message);
                log.Verbose("Message Added");
            }
        }
Ejemplo n.º 4
0
        public static void AddmessagetoQueue(FileInventoryEntity entity, string strConnectionString, string strType)
        {
            try
            {
                EventSourceWriter.Log.MessageMethod($"Adding Message to Queue for file {entity.RowKey}");

                // Retrieve storage account from connection string
                var account = Microsoft.WindowsAzure.Storage.CloudStorageAccount.Parse(CloudConfigurationManager.GetSetting("StorageConnectionString"));

                // Create the queue client
                var queueClient = account.CreateCloudQueueClient();

                // Retrieve a reference to a queue
                var queue = queueClient.GetQueueReference("urbanwaterqueue");

                // Create the queue if it doesn't already exist
                queue.CreateIfNotExists();

                // Create the queue message.
                //Meesage must be in the order type, filename, container, size, connection string
                var queueMessageString =
                    entity.RowKey + "," +
                    entity.PartitionKey + "," +
                    entity.LngFileLength + "," +
                    strConnectionString;

                var queueMessage = new Microsoft.WindowsAzure.Storage.Queue.CloudQueueMessage(queueMessageString);
                queue.AddMessage(queueMessage);
            }
            catch (Exception ex)
            {
                EventSourceWriter.Log.MessageMethod("Exception in AddmessagetoQueue" + ex.Message);
            }
        }
Ejemplo n.º 5
0
        } // GetQueueItem

        /// <summary>
        /// Removes a message from the queue
        /// </summary>
        /// <param name="queueName"></param>
        /// <param name="cloudQueueMessage"></param>
        public static void DeleteQueueItem(string queueName, Microsoft.WindowsAzure.Storage.Queue.CloudQueueMessage cloudQueueMessage,
                                           Microsoft.WindowsAzure.Storage.Queue.CloudQueue cloudQueue)
        {
            string containerName = queueName.ToLower(); // must be lower case!

            cloudQueue.DeleteMessageAsync(cloudQueueMessage);
        } // DeleteQueueItem
Ejemplo n.º 6
0
        /// <summary>
        /// Returns the 1st message as a queue item
        /// </summary>
        /// <param name="queueName"></param>
        /// <returns></returns>
        public static Microsoft.WindowsAzure.Storage.Queue.CloudQueueMessage GetQueueItem(string queueName, Microsoft.WindowsAzure.Storage.Queue.CloudQueue cloudQueue)
        {
            string containerName = queueName.ToLower(); // must be lower case!

            Microsoft.WindowsAzure.Storage.Queue.CloudQueueMessage cloudQueueMessage = cloudQueue.GetMessagesAsync(1).Result.FirstOrDefault();
            return(cloudQueueMessage);
        } // GetQueueItem
Ejemplo n.º 7
0
        /// <summary>
        /// Removes a message from the queue
        /// </summary>
        /// <param name="queueContainer"></param>
        /// <param name="cloudQueueMessage"></param>
        public void DeleteQueueItem(string queueContainer, Microsoft.WindowsAzure.Storage.Queue.CloudQueueMessage cloudQueueMessage)
        {
            InitializeStorage(queueContainer);

            string containerName = queueContainer.ToString().ToLower(); // must be lower case!

            Microsoft.WindowsAzure.Storage.Queue.CloudQueueClient queueStorage = queueStorageDictionary[containerName];
            Microsoft.WindowsAzure.Storage.Queue.CloudQueue       cloudQueue   = queueStorage.GetQueueReference(containerName);
            cloudQueue.DeleteMessage(cloudQueueMessage);
        } // DeleteQueueItem
Ejemplo n.º 8
0
        } // DeleteQueueItem

        /// <summary>
        /// Returns the 1st message as a queue item
        /// </summary>
        /// <param name="queueContainer"></param>
        /// <returns></returns>
        public Microsoft.WindowsAzure.Storage.Queue.CloudQueueMessage GetQueueItem(string queueContainer)
        {
            InitializeStorage(queueContainer);

            string containerName = queueContainer.ToString().ToLower(); // must be lower case!

            Microsoft.WindowsAzure.Storage.Queue.CloudQueueClient queueStorage = queueStorageDictionary[containerName];
            Microsoft.WindowsAzure.Storage.Queue.CloudQueue       cloudQueue   = queueStorage.GetQueueReference(containerName);

            Microsoft.WindowsAzure.Storage.Queue.CloudQueueMessage cloudQueueMessage = cloudQueue.GetMessage(TimeSpan.FromMinutes(1));

            return(cloudQueueMessage);
        } // GetQueueItem
        /// <summary>
        /// Grabs an item from the queue locking it for a specified timespan (you need to call DeleteItem to remove
        /// it from the queue)
        /// </summary>
        /// <param name="queueName"></param>
        /// <param name="timeSpan"></param>
        /// <returns></returns>
        public Model.Queue.QueueModel Dequeue(string queueName, TimeSpan timeSpan)
        {
            AzureQueueHelper azureQueueHelper = new AzureQueueHelper();
            DateTime         expirationDate   = DateTime.UtcNow.Add(timeSpan);

            Microsoft.WindowsAzure.Storage.Queue.CloudQueueMessage item = azureQueueHelper.GetQueueItem(queueName.ToLower());
            if (item == null)
            {
                return(null);
            }
            else
            {
                Model.Queue.QueueModel queueModel = new Model.Queue.QueueModel();
                queueModel.Id                  = item.Id;
                queueModel.PopReceipt          = item.PopReceipt;
                queueModel.Item                = item.AsString;
                queueModel.LockExpirationInUTC = expirationDate;

                return(queueModel);
            }
        }
Ejemplo n.º 10
0
        // POST api/bsm
        public HttpResponseMessage Post([FromBody] BsmBundle bundle)
        {
            Trace.TraceInformation("[TRACE] Entering BsmController::Post(BsmBundle)...");

            if (srBsmQueue == null)
            {
                Trace.TraceError("Unable to add BsmBundle to queue-- Inbound BSM queue not created");
                Trace.TraceInformation("[TRACE] Exiting BsmController::Post(BsmBundle)...");
                return(this.Request.CreateErrorResponse(HttpStatusCode.BadRequest, "Inbound BSM queue does not exist"));
            }

            if (this.ModelState.IsValid)
            {
                string strQueueMessage = Newtonsoft.Json.JsonConvert.SerializeObject(bundle);

                Microsoft.WindowsAzure.Storage.Queue.CloudQueueMessage rMessage =
                    new Microsoft.WindowsAzure.Storage.Queue.CloudQueueMessage(strQueueMessage);

                const int hours       = 1;
                const int mins        = 0;
                const int secs        = 0;
                TimeSpan  rTimeToLive = new TimeSpan(hours, mins, secs);

                Trace.TraceInformation("Adding BsmBundle message to inbound BSM queue...");
                srBsmQueue.AddMessage(rMessage, rTimeToLive);

                Trace.TraceInformation("[TRACE] Exiting BsmController::Post(BsmBundle)...");
                return(this.Request.CreateResponse(HttpStatusCode.OK));
            }
            else
            {
                Trace.TraceError("Unable to add BsmBundle to queue-- BsmBundle message not properly formatted");
                Trace.TraceInformation("[TRACE] Exiting BsmController::Post(BsmBundle)...");
                return(this.Request.CreateErrorResponse(HttpStatusCode.BadRequest, "BsmBundle message not properly formatted"));
            }
        }
        } // Run

        static void ProcessItem(Microsoft.WindowsAzure.Storage.Queue.CloudQueueMessage queueItem, string queueName, Microsoft.WindowsAzure.Storage.Queue.CloudQueue cloudQueue, ILogger log)
        {
            log.LogInformation("ProcessItem:" + queueItem);

            JSONService jsonService = new JSONService();

            FileEvent fileEvent = jsonService.Deserialize <FileEvent>(queueItem.AsString);

            log.LogInformation("ProcessItem Topic: " + fileEvent.topic);
            log.LogInformation("ProcessItem Subject: " + fileEvent.subject);

            // Make sure we have the correct event
            if (fileEvent.eventType == "Microsoft.Storage.BlobCreated") // && fileEvent.subject.ToLower().EndsWith("end_file.txt"))
            {
                // e.g. "subject": "/blobServices/default/containers/acmeinc/blobs/inbox/2020-04-13/test_end_file.txt"
                //                                                   01234567890123456789012345678901234567890123456789  14 -> 30 =16
                // e.g. "subject": "/blobServices/default/containers/acmeinc/blobs/test_end_file.txt"
                //                                                   01234567890123456789012345678901234567890123456789  13 -> 13 = 0
                string removedPrefix = fileEvent.subject.ToLower().Replace("/blobservices/default/containers/", string.Empty);
                string customerId    = removedPrefix.Substring(0, removedPrefix.IndexOf("/"));
                string partitionId   = removedPrefix.Substring(0, removedPrefix.IndexOf("/")); // this just happens to be the same as the customer id in the this example

                // Get the Cosmos DB data as to which pipeline belongs to this customer.
                DocumentDBRepository <CosmosIngestionData> documentDBRepository = new DocumentDBRepository <CosmosIngestionData>(log);
                var result = documentDBRepository.GetItems(o => o.CustomerId == customerId && o.PartitionId == partitionId).FirstOrDefault();

                if (result == null)
                {
                    // Someone forgot to create the CosmosDB document (whoops), send an email and log.  Give the developer "1" hour to get things setup.
                    log.LogInformation("Pipeline does not exist.  Setting queue item to retry in 1 hour.");
                    QueueService.IncreaseQueueItemLock(queueName, queueItem, TimeSpan.FromHours(1), cloudQueue);
                }
                else
                {
                    if (result.isADFEnabled)
                    {
                        // We are good to try to start the ADF
                        log.LogInformation("Starting Pipeline: " + result.ADFPipelineName);

                        try
                        {
                            // Try to start the pipeline (we are "trying" since technically something could have just disabled it :) )
                            DateTime dtNow               = DateTime.UtcNow; // you could make this EST or such....
                            string   inputFileSystem     = customerId;
                            int      blobsIndex          = removedPrefix.IndexOf("/blobs/") + 7;
                            int      lastSlashIndex      = removedPrefix.LastIndexOf("/");
                            string   inputFileDirectory  = removedPrefix.Substring(blobsIndex, lastSlashIndex - blobsIndex);
                            string   outputFileSystem    = Environment.GetEnvironmentVariable("LandingZoneDataLakeContainer");
                            string   outputFileDirectory = string.Format("customer-landing-data/{0}/{1:yyyy}/{2:MM}/{3:dd}", customerId, dtNow, dtNow, dtNow);

                            DataFactoryService.StartPipeline(inputFileSystem, inputFileDirectory, outputFileSystem, outputFileDirectory, result.ADFPipelineName, result.ADFResourceGroup, result.ADFDataFactoryName, result.ADFSubscriptionId, log);
                            QueueService.DeleteQueueItem(queueName, queueItem, cloudQueue);
                        }
                        catch (Exception ex)
                        {
                            // Pipeline could not start (it might be in a "provisioning state", set the queue item to try again in "5" minutes
                            log.LogInformation("Error starting Pipeline (item not dequeued): " + result.ADFPipelineName + " Error: " + ex.ToString());
                            QueueService.IncreaseQueueItemLock(queueName, queueItem, TimeSpan.FromMinutes(5), cloudQueue);
                        }
                    }
                    else
                    {
                        // Pipeline is not enabled, set the queue item to try again in "5" minutes
                        log.LogInformation("Pipeline: " + result.ADFPipelineName + " is not enabled.  Setting queue item to retry in 5 minutes.");
                        QueueService.IncreaseQueueItemLock(queueName, queueItem, TimeSpan.FromMinutes(5), cloudQueue);
                    }
                }
            }
            else
            {
                // Not a valid event item - delete from queue and log (tell someone to fixe the blob event filter)
                QueueService.DeleteQueueItem(queueName, queueItem, cloudQueue);
            }

            System.Threading.Thread.Sleep(500);   // Just so the UI does not scroll too fast
        } // Process Item
Ejemplo n.º 12
0
        } // DeleteQueueItem

        public static void IncreaseQueueItemLock(string queueName, Microsoft.WindowsAzure.Storage.Queue.CloudQueueMessage cloudQueueMessage, TimeSpan visibilityTimeout, Microsoft.WindowsAzure.Storage.Queue.CloudQueue cloudQueue)
        {
            string containerName = queueName.ToLower(); // must be lower case!

            cloudQueue.UpdateMessageAsync(cloudQueueMessage, visibilityTimeout, Microsoft.WindowsAzure.Storage.Queue.MessageUpdateFields.Visibility);
        } // DeleteQueueItem