Пример #1
0
        async Task SnsPublisher(IEnumerable <PublishRequest> publishRequests, TimeSpan duration, CancellationToken cancellationToken)
        {
            var publishTime = duration / publishRequests.Count();
            var sw          = Stopwatch.StartNew();
            var scheduler   = new TaskSchedulingInterval();

            foreach (var r in publishRequests)
            {
                scheduler.Start();
                await _snsClient.Value.PublishAsync(r, cancellationToken);

                await scheduler.WaitFor(publishTime, cancellationToken);
            }

            _details($"[VERBOSE] Requested {publishRequests.Count()} invocations in {sw.Elapsed}");
        }
Пример #2
0
        public async Task Handle(SNSEvent snsEvent, ILambdaContext context)
        {
            var command = JsonConvert.DeserializeObject <LambdaRequest <TJourney> >(snsEvent.Records[0].Sns.Message);

            var journeyReporter = new CloudWatchLogReporter <TJourney, TJourneyResult>(context.Logger);

            var executionInterval = command.Duration / command.RequestCount;

            var scheduler = new TaskSchedulingInterval();

            var endOfStep         = new CancellationTokenSource();
            var endOfStepDuration = command.Duration + (command.Duration / 10);

            endOfStep.CancelAfter(endOfStepDuration);
            var endOfStepTask = Task.Delay(endOfStepDuration, endOfStep.Token);

            try
            {
                var pendingTasks = new List <Task>();
                for (var i = 0; i < command.RequestCount; i++)
                {
                    scheduler.Start();
                    pendingTasks.Add(FireAndForgetJourneyWithLowMemoryStateDelegste(_journeyTaker, command, journeyReporter, i,
                                                                                    endOfStep.Token));

                    await scheduler.WaitFor(executionInterval, endOfStep.Token);
                }

                var firstTask = await Task.WhenAny(Task.WhenAll(pendingTasks), endOfStepTask);

                journeyReporter.ReportFinished(firstTask == endOfStepTask ? CompletionState.Timeout : CompletionState.Success);
            }
            catch (Exception e)
            {
                journeyReporter.ReportFinished(CompletionState.Error, e);
            }
        }