private static void TestSubscriptionExecution(string groupID) { string interestGroupLocation = "grp/" + groupID + "/"; var informationObjects = StorageSupport.CurrActiveContainer.GetInformationObjects(interestGroupLocation, null, io => io is AddressAndLocation && SubscribeSupport.GetSubscriptions( io.RelativeLocation) != null).ToArray (); OperationRequest operationRequest = new OperationRequest(); SubscriptionChainRequestContent content = SubscriptionChainRequestContent.CreateDefault(); SubscriptionChainRequestMessage message = SubscriptionChainRequestMessage.CreateDefault(); message.ContentItemID = content.ID; content.SubmitTime = DateTime.UtcNow; SubscriptionTarget[] targets = informationObjects. Select(io => { SubscriptionTarget target = SubscriptionTarget.CreateDefault(); target.BlobLocation = io.RelativeLocation; return(target); }).ToArray(); content.SubscriptionTargetCollection.CollectionContent.AddRange(targets); content.StoreInformation(); WorkerSupport.ExecuteSubscriptionChain(message); }
private bool PollAndHandleMessage(Task[] tasks, int availableIx, Task availableTask) { CloudQueueMessage message; QueueEnvelope envelope = QueueSupport.GetFromDefaultQueue(out message); if (envelope != null) { Task executing = Task.Factory.StartNew(() => WorkerSupport.ProcessMessage(envelope)); tasks[availableIx] = executing; QueueSupport.CurrDefaultQueue.DeleteMessage(message); if (availableTask.Exception != null) { ErrorSupport.ReportException(availableTask.Exception); } return(true); } else { if (message != null) { QueueSupport.CurrDefaultQueue.DeleteMessage(message); ErrorSupport.ReportMessageError(message); } GC.Collect(); return(false); } }
private bool PollAndHandleSubscriptionChain(Task[] tasks, int availableIx, Task availableTask) { var result = SubscribeSupport.GetOwnerChainsInOrderOfSubmission(); if (result.Length == 0) { return(false); } string acquiredEtag = null; var firstLockedOwner = result.FirstOrDefault( lockCandidate => SubscribeSupport.AcquireChainLock(lockCandidate, out acquiredEtag)); if (firstLockedOwner == null) { return(false); } var executing = Task.Factory.StartNew( () => WorkerSupport.ProcessOwnerSubscriptionChains(firstLockedOwner, acquiredEtag, CURRENT_HARDCODED_CONTAINER_NAME)); tasks[availableIx] = executing; if (availableTask.Exception != null) { ErrorSupport.ReportException(availableTask.Exception); } return(true); }
public static void ExecuteMethod_PublishGroupContentToWww(string groupID, bool useWorker, string currentContainerName, string wwwContainerName) { if (RenderWebSupport.WwwEnabledGroups.ContainsKey(groupID) == false) // Only controlled groups can have website/do web publishing { return; } string groupWwwPublicSiteLocation = "grp/" + groupID + "/" + RenderWebSupport.DefaultPublicWwwSiteLocation; PublishWebContentOperation operation = PublishWebContentOperation.CreateDefault(); operation.SourceContainerName = currentContainerName; operation.TargetContainerName = wwwContainerName; operation.SourceOwner = "grp/" + groupID; operation.SourcePathRoot = "wwwsite"; if (useWorker) { //QueueSupport.PutToOperationQueue(localGroupTemplates, renderLocalTemplates); OperationRequest operationRequest = new OperationRequest(); operationRequest.PublishWebContent = operation; QueueSupport.PutToOperationQueue(operationRequest); } else { WorkerSupport.ProcessPublishWebContent(operation); } }
private static void RunQueueWorker(QueueEnvelope givenEnvelope) { bool loop = true; while (loop) { loop = givenEnvelope == null; QueueEnvelope envelope; if (givenEnvelope == null) { CloudQueueMessage message = null; envelope = QueueSupport.GetFromDefaultQueue(out message); QueueSupport.CurrDefaultQueue.DeleteMessage(message); } else { envelope = givenEnvelope; } try { WorkerSupport.ProcessMessage(envelope); } catch (Exception ex) { string msg = ex.Message; } //Thread.Sleep(5000); } }
private static void ProcessErrors(bool useWorker) { if (useWorker) { List <QueueEnvelope> envelopes = new List <QueueEnvelope>(); List <CloudQueueMessage> messages = new List <CloudQueueMessage>(); CloudQueueMessage message = null; QueueEnvelope envelope = ErrorSupport.RetrieveRetryableEnvelope(out message); while (envelope != null) { //WorkerSupport.ProcessMessage(envelope, false); //QueueSupport.CurrErrorQueue.DeleteMessage(message); messages.Add(message); envelope.CurrentRetryCount++; envelopes.Add(envelope); envelope = ErrorSupport.RetrieveRetryableEnvelope(out message); } envelopes.ForEach(QueueSupport.PutToDefaultQueue); messages.ForEach(msg => QueueSupport.CurrErrorQueue.DeleteMessage(msg)); } else { CloudQueueMessage message = null; QueueEnvelope envelope = ErrorSupport.RetrieveRetryableEnvelope(out message); while (envelope != null) { WorkerSupport.ProcessMessage(envelope, false); QueueSupport.CurrErrorQueue.DeleteMessage(message); envelope = ErrorSupport.RetrieveRetryableEnvelope(out message); } } }
private static void ExecuteSubscriptionChain(string groupID) { string interestGroupLocation = SubscribeSupport.ChainRequestDirectory + "grp/" + groupID + "/"; var submissions = StorageSupport.CurrActiveContainer.GetInformationObjects(interestGroupLocation, null, io => io is SubscriptionChainRequestContent). Cast <SubscriptionChainRequestContent>().ToArray(); WorkerSupport.ExecuteSubscriptionChains(submissions); }
private static void TestSubscriptionChainPick() { bool result = WorkerSupport.PollAndExecuteChainSubscription(); }
public override void Run() { GracefullyStopped = false; //ThreadPool.SetMinThreads(3, 3); Task[] tasks = new Task[] { Task.Factory.StartNew(() => { }), Task.Factory.StartNew(() => { }), Task.Factory.StartNew(() => { }), //Task.Factory.StartNew(() => {}), //Task.Factory.StartNew(() => {}), //Task.Factory.StartNew(() => {}), }; QueueSupport.ReportStatistics("Starting worker: " + CurrWorkerID, TimeSpan.FromDays(1)); Task.Factory.StartNew(RefreshStockCompanyData); while (!IsStopped) { try { Task.WaitAny(tasks); if (IsStopped) { break; } int availableIx; Task availableTask = WorkerSupport.GetFirstCompleted(tasks, out availableIx); bool handledSubscriptionChain = PollAndHandleSubscriptionChain(tasks, availableIx, availableTask); if (handledSubscriptionChain) { // TODO: Fix return value check Thread.Sleep(1000); continue; } bool handledMessage = PollAndHandleMessage(tasks, availableIx, availableTask); if (handledMessage) { continue; } Thread.Sleep(1000); } catch (AggregateException ae) { foreach (var e in ae.Flatten().InnerExceptions) { ErrorSupport.ReportException(e); } Thread.Sleep(10000); // or ... // ae.Flatten().Handle((ex) => ex is MyCustomException); } /* * catch (MessagingException e) * { * if (!e.IsTransient) * { * Trace.WriteLine(e.Message); * throw; * } * Thread.Sleep(10000); * }*/ catch (OperationCanceledException e) { if (!IsStopped) { Trace.WriteLine(e.Message); throw; } } catch (Exception ex) { ErrorSupport.ReportException(ex); throw; } } Task.WaitAll(tasks); foreach (var task in tasks.Where(task => task.Exception != null)) { ErrorSupport.ReportException(task.Exception); } QueueSupport.ReportStatistics("Stopped: " + CurrWorkerID, TimeSpan.FromDays(1)); GracefullyStopped = true; }
private static void RunTaskedQueueWorker() { Task[] tasks = new Task[] { Task.Factory.StartNew(() => {}), Task.Factory.StartNew(() => {}), Task.Factory.StartNew(() => {}), //Task.Factory.StartNew(() => {}), //Task.Factory.StartNew(() => {}), }; bool IsStopped = false; int initialCount = 0; while (true) { try { Task.WaitAny(tasks); if (IsStopped) { Task.WaitAll(tasks); foreach (var task in tasks) { if (task.Exception != null) { ErrorSupport.ReportException(task.Exception); } } break; } int availableIx; Task availableTask = WorkerSupport.GetFirstCompleted(tasks, out availableIx); CloudQueueMessage message; QueueEnvelope envelope = QueueSupport.GetFromDefaultQueue(out message); if (envelope != null) { Task executing = Task.Factory.StartNew(() => WorkerSupport.ProcessMessage(envelope)); tasks[availableIx] = executing; QueueSupport.CurrDefaultQueue.DeleteMessage(message); if (availableTask.Exception != null) { ErrorSupport.ReportException(availableTask.Exception); } } else { if (message != null) { QueueSupport.CurrDefaultQueue.DeleteMessage(message); ErrorSupport.ReportMessageError(message); } Thread.Sleep(1000); } } catch (AggregateException ae) { foreach (var e in ae.Flatten().InnerExceptions) { ErrorSupport.ReportException(e); } Thread.Sleep(10000); // or ... // ae.Flatten().Handle((ex) => ex is MyCustomException); } /* * catch (MessagingException e) * { * if (!e.IsTransient) * { * Trace.WriteLine(e.Message); * throw; * } * Thread.Sleep(10000); * }*/ catch (OperationCanceledException e) { if (!IsStopped) { Trace.WriteLine(e.Message); throw; } } catch (Exception ex) { ErrorSupport.ReportException(ex); throw; } } }