public static async Task <int> PeriodicTask(
            [OrchestrationTrigger] DurableOrchestrationContext ctx, TraceWriter log)
        {
            var timesRun = ctx.GetInput <int>();

            timesRun++;
            if (!ctx.IsReplaying)
            {
                log.Info("starting the periodic task activity " + ctx.InstanceId + " " + timesRun);
            }
            await ctx.CallActivityAsync("A_PeriodicActivity", timesRun);

            var nextRun = ctx.CurrentUtcDateTime.AddSeconds(15);
            await ctx.CreateTimer(nextRun, CancellationToken.None);

            ctx.ContinueAsNew(timesRun);
            return(timesRun);
        }
Exemple #2
0
        public static async Task <string> ProccessTranscriptions([OrchestrationTrigger] DurableOrchestrationContext context)
        {
            //get list of transactions where status == success
            var list = await context.CallActivityAsync <IEnumerable <Transcription> > ("PollCompleteTranscriptions", null);

            //for each transaction in the list, download the transcript
            foreach (var t in list)
            {
                var blob = await context.CallActivityAsync <Uri> ("ProcessTranscript", t);

                if (blob != null && await context.CallActivityAsync <bool> ("ArchiveAudioBlob", t.RecordingsUrl))
                {
                    await context.CallActivityAsync <bool> ("DeleteTranscript", t);
                }
            }

            return(context.InstanceId);
        }
        public static async Task IotHubScaleOrchestrator(
            [OrchestrationTrigger] DurableOrchestrationContext context,
            TraceWriter log)
        {
            log.Info("IotHubScaleOrchestrator started");

            // launch and wait on the "worker" function
            await context.CallActivityAsync(IotHubScaleWorkerName);

            // register a timer with the durable functions infrastructure to re-launch the orchestrator in the future
            DateTime wakeupTime = context.CurrentUtcDateTime.Add(TimeSpan.FromMinutes(JobFrequencyMinutes));
            await context.CreateTimer(wakeupTime, CancellationToken.None);

            log.Info(String.Format("IotHubScaleOrchestrator done...  tee'ing up next instance in {0} minutes.", JobFrequencyMinutes.ToString()));

            // end this 'instance' of the orchestrator and schedule another one to start based on the timer above
            context.ContinueAsNew(null);
        }
        public static async Task GameMonitorWorkflow(
            [OrchestrationTrigger] DurableOrchestrationContext context,
            ILogger logger)
        {
            var username = context.GetInput <string>();

            logger.LogInformation("Start of game monitor workflow for {user}", username);

            var monsterKilled = context.WaitForExternalEvent(KILLMONSTER);
            var treasureFound = context.WaitForExternalEvent(GOTTREASURE);

            await Task.WhenAll(monsterKilled, treasureFound);

            await context.CallActivityAsync(nameof(ConsoleFunctions.AddToQueue),
                                            $"{username} has won the game!");

            logger.LogInformation("User {user} won the game.", username);
        }
Exemple #5
0
        public static async Task <List <Report> > GenerateReports(
            [OrchestrationTrigger] DurableOrchestrationContext ctx,
            ILogger log)
        {
            log.LogInformation("Executing orchestrator function");
            var payments    = ctx.GetInput <List <Payment> >();
            var reportTasks = new List <Task <Report> >();

            foreach (var paymentGroup in payments.GroupBy(p => p.CardType))
            {
                var task = ctx.CallActivityAsync <Report>("A_CreateReport", paymentGroup.ToList());
                reportTasks.Add(task);
            }

            var reports = await Task.WhenAll(reportTasks);

            return(reports.ToList());
        }
        public static async Task FullBackupMain([OrchestrationTrigger] DurableOrchestrationContext context, [OrchestrationClient] DurableOrchestrationClient client, ILogger log)
        {
            var jobs = await context.CallActivityAsync <IEnumerable <FunctionParameters.CollectionBackupJob> >(Names.ResolveCollectionBackupJobs, null);

            foreach (var job in jobs)
            {
                try
                {
                    await context.CallActivityAsync(Names.BackupDocuments, job);
                }
                catch (Exception ex)
                {
                    log.LogError(ex, $"Error while backing up collection '{job.CollectionLink}'.");
                }
            }

            log.LogInformation($"Completed full backup with a total of {jobs.Count()} collections backed up.");
        }
Exemple #7
0
        public static async Task ProcessClaimOrchestrator(
            [OrchestrationTrigger] DurableOrchestrationContext context,
            ILogger log)
        {
            var claim = context.GetInput <WhatIfDemoDbDataContext.Claim>();

            // Sending mobile notification
            await context.CallActivityAsync(nameof(SendMobileNotification), claim);

            // Waiting for the claim to be approved
            await context.WaitForExternalEvent(nameof(ApproveClaim));

            // Saving the claim to DB
            var retryOptions = new RetryOptions(TimeSpan.FromSeconds(5), 3);
            await context.CallActivityWithRetryAsync <WhatIfDemoDbDataContext.Claim>(nameof(SaveClaimToDb), retryOptions, claim);

            log.LogWarning($"Claim {claim.id} processing finished!");
        }
Exemple #8
0
        public static async Task DebatchCoordinatesFile([OrchestrationTrigger] DurableOrchestrationContext context, ILogger log)
        {
            log.LogInformation("Starting DebatchCoordinatesFile");

            List <List <string> > groupsOfLines = await context.CallActivityAsync <List <List <string> > >(nameof(GetCoordinates), null);

            log.LogInformation("retreived coordinates file as Stream");

            List <Task> parallelTasks = new List <Task>();

            foreach (var group in groupsOfLines)
            {
                parallelTasks.Add(context.CallActivityAsync(nameof(ProcessGroupOfLines), group));
            }
            await Task.WhenAll(parallelTasks);

            log.LogInformation("All done");
        }
Exemple #9
0
        public static async Task OrchestratorThrowWithRetry([OrchestrationTrigger] DurableOrchestrationContext ctx)
        {
            string message = ctx.GetInput <string>();

            RetryOptions options = new RetryOptions(TimeSpan.FromSeconds(5), 3);

            // Specify an explicit sub-orchestration ID that can be queried by the test driver.
            Guid subInstanceId = await ctx.CallActivityAsync <Guid>(nameof(TestActivities.NewGuid), null);

            ctx.SetCustomStatus(subInstanceId.ToString("N"));

            // This throw happens in the implementation of an orchestrator.
            await ctx.CallSubOrchestratorWithRetryAsync(
                nameof(TestOrchestrations.ThrowOrchestrator),
                options,
                subInstanceId.ToString("N"),
                message);
        }
Exemple #10
0
        public static async Task BatchActor([OrchestrationTrigger] DurableOrchestrationContext ctx)
        {
            var requiredItems = new HashSet <string>(new[] { @"item1", @"item2", @"item3", @"item4", @"item5" });

            // If an item was sent in during StartAsNew() this handles that
            string itemName = ctx.GetInput <string>();

            requiredItems.Remove(itemName);

            while (requiredItems.Any())
            {
                itemName = await ctx.WaitForExternalEvent <string>("newItem");

                requiredItems.Remove(itemName);
            }

            // we've received events for all the required items; safe to bail now!
        }
Exemple #11
0
        public static async Task <WordPairs> RunOrchestrator([OrchestrationTrigger] DurableOrchestrationContext context)
        {
            IEnumerable <string> textFileNames = await context.CallActivityAsync <IEnumerable <string> >("ListFiles", "out-container");

            List <Task <string> > tasks = new List <Task <string> >();

            foreach (var filename in textFileNames)
            {
                tasks.Add(context.CallActivityAsync <string>("RetrieveContent", filename));
            }

            var completedTasks = await Task.WhenAll(tasks);

            var result = CalculateMostUsed(completedTasks);
            await context.CallActivityAsync("WriteToBlob", result);

            return(result);
        }
Exemple #12
0
        public static async Task TopOrchestrator(
            [OrchestrationTrigger] DurableOrchestrationContext context, ILogger log)
        {
            if (!context.IsReplaying)
            {
                log.LogInformation($"{nameof(TopOrchestrator)} - Start. InstanceId={context.InstanceId}");
            }

            for (int i = 0; i < 100; i++)
            {
                await context.CallSubOrchestratorAsync <string>(nameof(SubOrchestrator), i);
            }

            if (!context.IsReplaying)
            {
                log.LogInformation($"{nameof(TopOrchestrator)} - End. InstanceId={context.InstanceId}");
            }
        }
Exemple #13
0
        public static async Task StartKokuhakuWorkflow(
            [OrchestrationTrigger] DurableOrchestrationContext context,
            TraceWriter log)
        {
            var info = context.GetInput <KokuhakuInformation>();
            await context.CallActivityAsync(nameof(SendEmail), info);

            var approved = await context.WaitForExternalEvent <bool>("Approval");

            if (approved)
            {
                await context.CallActivityAsync(nameof(Approved), info);
            }
            else
            {
                await context.CallActivityAsync(nameof(Reject), info);
            }
        }
Exemple #14
0
        public static async Task <IEnumerable <WeatherDto> > Run([OrchestrationTrigger] DurableOrchestrationContext context)
        {
            var date = context.GetInput <DateTime>();

            var requests = new Task <WeatherDto> [3];

            // fan out
            for (var i = 0; i < 3; i++)
            {
                requests[i] = context.CallActivityAsync <WeatherDto>("GetWeatherFromApi", date.AddDays(i));
            }

            // fan in
            await Task.WhenAll(requests);

            // aggregate results
            return(requests.Select(x => x.Result).Where(x => x != null));
        }
Exemple #15
0
        public static async Task <dynamic> RunOrchestrator(
            [OrchestrationTrigger] DurableOrchestrationContext context)
        {
            var tasks        = new List <Task <OrderDetails> >();
            var orderTotals  = new List <double>();
            var transactions = await context.CallActivityAsync <IEnumerable <StripeCharge> >("Durable_GetTransactions", null);

            foreach (var transaction in transactions)
            {
                tasks.Add(context.CallActivityAsync <OrderDetails>("Durable_GetOrderProcess", transaction));
            }

            await Task.WhenAll(tasks);

            return(from details in tasks
                   group details by details.Result.status into s
                   select new { status = s.Key, count = s.Count() });
        }
        public static async Task <List <string> > Run([OrchestrationTrigger] DurableOrchestrationContext context)
        {
            var outputs = new List <string>();

            var       ValidateMe = context.GetInput <string>();
            JObject   stuff      = JObject.Parse(ValidateMe);
            Documento doc        = JsonConvert.DeserializeObject <Documento>(ValidateMe);

            outputs.Add(await context.CallActivityAsync <string>("ValidationOne", doc));
            outputs.Add(await context.CallActivityAsync <string>("ValidationTwo", doc));
            outputs.Add(await context.CallActivityAsync <string>("ValidationThree", doc));
            outputs.Add(await context.CallActivityAsync <string>("ValidationFour", doc));
            outputs.Add(await context.CallActivityAsync <string>("ValidationFive", doc));
            outputs.Add(await context.CallActivityAsync <string>("ValidationSix", doc));

            outputs.Add(ValidateMe);
            return(outputs);
        }
Exemple #17
0
        public static async Task NewOrderWorkflow(
            [OrchestrationTrigger] DurableOrchestrationContext ctx,
            ILogger log)
        {
            var order = ctx.GetInput <Order>();

            if (!ctx.IsReplaying)
            {
                log.LogInformation($"Starting new order workflow for {order.Id}.");
            }
            await ctx.CallActivityAsync(nameof(SaveOrderToDatabaseActivity), order);

            await ctx.CallActivityAsync(nameof(CreateLicenseFileActivity), order);

            await ctx.CallActivityAsync(nameof(EmailLicenseFileActivity), order);

            log.LogInformation($"Order {order.Id} processed successfully.");
        }
Exemple #18
0
        public static async Task <string> RunOrchestrator(
            [OrchestrationTrigger] DurableOrchestrationContext context, ILogger log)
        {
            log.LogInformation($"************** RunOrchestrator method executing ********************");

            VirtualMachineIds virtualMachineIds = context.GetInput <VirtualMachineIds>();

            // Fanning out
            log.LogInformation($"************** Fanning out ********************");


            var parallelActivities = new List <Task <string> >();

            foreach (var vmid in virtualMachineIds.VirtualMachineIdList)
            {
                log.LogInformation($"************** vmid = " + vmid);

                // Start a new activity function and capture the task reference
                Task <string> task = context.CallActivityAsync <string>("vmManagementOrchestration_ToggleVM", vmid);

                // Store the task reference for later
                parallelActivities.Add(task);
            }


            // Wait until all the activity functions have done their work
            log.LogInformation($"************** 'Waiting' for parallel results ********************");
            await Task.WhenAll(parallelActivities);

            log.LogInformation($"************** All activity functions complete ********************");

            // Now that all parallel activity functions have completed,
            // fan in AKA aggregate the results, in this case into a single
            // string using a StringBuilder
            log.LogInformation($"************** fanning in ********************");
            var sb = new StringBuilder();

            foreach (var completedParallelActivity in parallelActivities)
            {
                sb.AppendLine(completedParallelActivity.Result);
            }

            return(sb.ToString());
        }
Exemple #19
0
        public async Task Run([OrchestrationTrigger] DurableOrchestrationContext context,
                              ILogger log)
        {
            var teamModel = context.GetInput <TeamModel>();

            if (!teamModel.Initialized)
            {
                await context.CallSubOrchestratorWithRetryAsync(nameof(InitializeOrchestrator), _options.AsRetryOptions(), teamModel);

                teamModel.Initialized = true;
            }

            try
            {
                var weeks = context.CurrentUtcDateTime.Date
                            .Range(_options.PastWeeks, _options.FutureWeeks, _options.StartDayOfWeek);

                var weekTasks = weeks
                                .Select(startDate => new WeekModel
                {
                    StartDate = startDate,
                    StoreId   = teamModel.StoreId,
                    TeamId    = teamModel.TeamId
                })
                                .Select(weekModel => context.CallSubOrchestratorWithRetryAsync(nameof(WeekOrchestrator), _options.AsRetryOptions(), weekModel));

                await Task.WhenAll(weekTasks);
            }
            catch (Exception ex) when(_options.ContinueOnError)
            {
                log.LogTeamError(ex, teamModel);
            }

            if (_options.FrequencySeconds < 0)
            {
                return;
            }

            var dueTime = context.CurrentUtcDateTime.AddSeconds(_options.FrequencySeconds);

            await context.CreateTimer(dueTime, CancellationToken.None);

            context.ContinueAsNew(teamModel);
        }
Exemple #20
0
        public static async Task Run(
            [OrchestrationTrigger] DurableOrchestrationContext orchestrationContext,
            ILogger logger)
        {
            logger.LogInformation("{0} function processed a request.", nameof(InitialLoadingOrchestratorFunction));

            int pageNumber = 1;

            while (true)
            {
                logger.LogInformation("Processing {0} page", pageNumber);

                ShowsPage page = await orchestrationContext.CallActivityAsync <ShowsPage>(nameof(GetShowsPageFunction), pageNumber);

                if (page.IsLastPage)
                {
                    break;
                }

                IEnumerable <Task <CastInfo> > castInfosTasks = page.Shows.Select(
                    show => orchestrationContext.CallActivityAsync <CastInfo>(nameof(GetShowCastFunction), show.Id));

                var castInfos = await Task.WhenAll(castInfosTasks);

                var showsWithCast = new List <ShowWithCast>(page.Shows.Count);

                foreach (var castInfo in castInfos)
                {
                    var showToEnrich = page.Shows.First(show => show.Id == castInfo.ShowId);
                    showsWithCast.Add(
                        new ShowWithCast
                    {
                        Id      = showToEnrich.Id,
                        Name    = showToEnrich.Name,
                        Updated = showToEnrich.Updated,
                        Cast    = castInfo.Cast
                    });
                }

                await orchestrationContext.CallActivityAsync(nameof(InsertShowsFunction), showsWithCast);

                pageNumber++;
            }
        }
Exemple #21
0
        public static async Task <string> Run(
            [OrchestrationTrigger] DurableOrchestrationContext context)
        {
            string result    = string.Empty;
            string requestID = context.GetInput <string>()?.Trim();

            if (string.IsNullOrEmpty(requestID))
            {
                requestID = Guid.NewGuid().ToString();
            }

            var actvityInfo = new ActivityCreateBlobInfo()
            {
                BlobContainer   = requestID,
                NumberOfRecords = 100,
            };

            int loopCount = 10;
            var tasks     = new List <Task <string> >();

            for (int i = 0; i < loopCount; i++)
            {
                actvityInfo.BlobName      = $"{i+1}.json";
                actvityInfo.NumberToStart = i * actvityInfo.NumberOfRecords + 1;

                tasks.Add(
                    context.CallActivityAsync <string>(
                        "WriteRecordsToBlob",
                        actvityInfo)
                    );
            }

            //case using WhenAll
            string[] results = await Task.WhenAll(tasks);

            //.ConfigureAwait(false); 사용하면 안됨.
            // 기본값 true로 해서 SynchronizationContext로 동기화하지 않는다면, 끝났다는 정보를 API가 제공하지 못함.
            // 즉, 실행이 끝났는대도 API는 running을 알려주게 됨.

            result = JsonConvert.SerializeObject(results);


            return(result);
        }
Exemple #22
0
        public static async Task <long> DiskUsage([OrchestrationTrigger] DurableOrchestrationContext ctx)
        {
            string directory = ctx.GetInput <string>();

            string[] files = await ctx.CallActivityAsync <string[]>(nameof(TestActivities.GetFileList), directory);

            var tasks = new Task <long> [files.Length];

            for (int i = 0; i < files.Length; i++)
            {
                tasks[i] = ctx.CallActivityAsync <long>(nameof(TestActivities.GetFileSize), files[i]);
            }

            await Task.WhenAll(tasks);

            long totalBytes = tasks.Sum(t => t.Result);

            return(totalBytes);
        }
Exemple #23
0
        public static async Task <int> TryCatchLoop([OrchestrationTrigger] DurableOrchestrationContext ctx)
        {
            int iterations = ctx.GetInput <int>();
            int catchCount = 0;

            for (int i = 0; i < iterations; i++)
            {
                try
                {
                    await ctx.CallActivityAsync(nameof(TestActivities.ThrowActivity), "Kah-BOOOOOM!!!");
                }
                catch (FunctionFailedException)
                {
                    catchCount++;
                }
            }

            return(catchCount);
        }
Exemple #24
0
        public static async Task <List <string> > RunOrchestrator(
            [OrchestrationTrigger] DurableOrchestrationContext context)
        {
            var outputs = new List <string>();

            outputs.Add(await context.CallActivityAsync <string>(nameof(StringReturnActivity), "Tokyo"));
            var result2 = await context.CallActivityAsync <string>(nameof(Workaround1FixedActivity), "Novi Sad");

            var result = JsonConvert.DeserializeObject <SelfRefClass>(result2, new JsonSerializerSettings()
            {
                TypeNameHandling           = TypeNameHandling.Objects,
                PreserveReferencesHandling = PreserveReferencesHandling.Objects,
                ReferenceLoopHandling      = ReferenceLoopHandling.Serialize
            });

            outputs.Add(result.Name);

            return(outputs);
        }
Exemple #25
0
        public static async Task <List <string> > Orchestrator(
            [OrchestrationTrigger] DurableOrchestrationContext context)
        {
            var input = context.GetInput <Input>();

            var outputs = new List <Task <string> >();

            // Replace "hello" with the name of your Durable Activity Function.
            outputs.Add(context.CallActivityAsync <string>("Function1_Hello", "Tokyo"));
            outputs.Add(context.CallActivityAsync <string>("Function1_Hello", "Seattle"));
            context.SetCustomStatus("Seattle klart");
            outputs.Add(context.CallActivityAsync <string>("Function1_Hello", "London"));

            await Task.WhenAll(outputs);


            // returns ["Hello Tokyo!", "Hello Seattle!", "Hello London!"]
            return(outputs);
        }
Exemple #26
0
        public static async Task Run(
            [OrchestrationTrigger] DurableOrchestrationContext counterContext,
            TraceWriter log)
        {
            int numberOfExecutions = 0;

            try
            {
                numberOfExecutions = counterContext.GetInput <int>();
                log.Info($"********{counterContext.InstanceId}: Current counter state is {numberOfExecutions}. isReplaying: {counterContext.IsReplaying} Waiting for next operation.**************");

                log.Info($"*********{counterContext.InstanceId}: Call activity ExistFile from {numberOfExecutions}*************");
                var existsFile = await counterContext.CallActivityAsync <bool>("ExistFile", numberOfExecutions.ToString());

                if (existsFile)
                {
                    log.Info($"*********{counterContext.InstanceId}: EXISTS FILE {numberOfExecutions}.json *************");

                    log.Info($"*********{counterContext.InstanceId}: Call activity AddCRM from {numberOfExecutions}*************");
                    await counterContext.CallActivityAsync("AddCRM", numberOfExecutions.ToString());

                    log.Info($"*********Add element to queeue *************");
                    await counterContext.CallActivityAsync("AddQueueTrigger", numberOfExecutions.ToString());

                    log.Info($"*********END element to queeue *************");
                }
                else
                {
                    log.Info($"*********{counterContext.InstanceId}: NO EXIST FILE {numberOfExecutions}.json *************");
                }

                log.Info($"*********Return {counterContext.InstanceId}: FINISH from {numberOfExecutions}*************");
            }
            catch (Exception ex)
            {
                log.Error($"**********ERROR General execution: {numberOfExecutions} -  {counterContext.IsReplaying} - {counterContext.InstanceId} *********", ex.InnerException != null ? ex.InnerException : ex);
                if (!counterContext.IsReplaying)
                {
                    log.Info($"**********RETRY execution: {numberOfExecutions} - {counterContext.InstanceId} *********");
                    counterContext.ContinueAsNew(numberOfExecutions);
                }
            }
        }
        public static bool VerifyUniqueGuids([OrchestrationTrigger] DurableOrchestrationContext ctx)
        {
            HashSet <Guid> guids = new HashSet <Guid>();

            for (int i = 0; i < 10000; i++)
            {
                Guid newGuid = ctx.NewGuid();
                if (guids.Contains(newGuid))
                {
                    return(false);
                }
                else
                {
                    guids.Add(newGuid);
                }
            }

            return(true);
        }
Exemple #28
0
        public static async Task MakeTemplate(
            [OrchestrationTrigger] DurableOrchestrationContext context)
        {
            var list  = context.GetInput <List <string> >() ?? new List <string>();
            var value = await context.WaitForExternalEvent <string>(Consts.DurableEventNameAddToTemplate);

            if (value.StartsWith(Consts.FinishMakingTemplate))
            {
                // 完成したリストをReplyトークンとともに返信Activityに渡す
                var token = value.Replace(Consts.FinishMakingTemplate + "_", string.Empty);
                await context.CallActivityAsync(nameof(SendTemplates), (token, list));
            }
            else
            {
                // リストにセリフを追加しオーケストレーターを再実行
                list.Add(value);
                context.ContinueAsNew(list);
            }
        }
        public static async Task <List <string> > RunOrchestrator(
            [OrchestrationTrigger] DurableOrchestrationContext context)
        {
            var outputs = new List <string>();

            String content = context.GetInput <String>();
            UpdateBaseImageRequest request = JsonConvert.DeserializeObject <UpdateBaseImageRequest>(content);

            request.stack = "php";
            outputs.Add(await context.CallActivityAsync <string>("HttpUpdateBaseImage_UpdateStack", request));
            request.stack = "dotnetcore";
            outputs.Add(await context.CallActivityAsync <string>("HttpUpdateBaseImage_UpdateStack", request));
            request.stack = "python";
            outputs.Add(await context.CallActivityAsync <string>("HttpUpdateBaseImage_UpdateStack", request));
            request.stack = "node";
            outputs.Add(await context.CallActivityAsync <string>("HttpUpdateBaseImage_UpdateStack", request));

            return(outputs);
        }
        public static async Task <List <BusinessRules.RuleResponse> > Run(
            [OrchestrationTrigger] DurableOrchestrationContext context)
        {
            var data = await context.CallActivityAsync <BusinessRules.CustomersData>("XmlDeserialiser");

            var tasks = new List <Task <BusinessRules.RuleResponse> >();

            for (int i = 0; i < 300; i++)
            {
                tasks.Add(context.CallActivityAsync <BusinessRules.RuleResponse>("Rule1", data));
                // tasks.Add(context.CallActivityAsync<BusinessRules.RuleResponse>("Rule2", data)); -
                // tasks.Add(context.CallActivityAsync<BusinessRules.RuleResponse>("Rule2", data)); -
            }
            await Task.WhenAll(tasks);

            var result = tasks.Select(x => x.Result).ToList();

            return(result);
        }