Exemplo n.º 1
0
 protected async Task SendTotal(RunningTotal total, string location)
 {
 }
Exemplo n.º 2
0
        protected async override Task ExecuteAsync(CancellationToken stoppingToken)
        {
            bool queueEmpty  = false;
            var  delayString = configurationPackage.Settings.Sections["Timing"]
                               .Parameters["MessageMaxDelaySeconds"].Value;
            var delay  = int.Parse(delayString);
            var filter = await IdempotencyFilter.NewIdempotencyFilterAsync(
                "logMessages", delay, stateManager);

            var store = await
                        stateManager.GetOrAddAsync <IReliableDictionary <string, RunningTotal> >("partialCount");

            while (!stoppingToken.IsCancellationRequested)
            {
                while (!queueEmpty && !stoppingToken.IsCancellationRequested)
                {
                    RunningTotal finalDayTotal = null;
                    using (ITransaction tx = stateManager.CreateTransaction())
                    {
                        var result = await queue.TryDequeueAsync(tx);

                        if (!result.HasValue)
                        {
                            queueEmpty = true;
                        }
                        else
                        {
                            var item = await filter.NewMessage <PurchaseInfo>(result.Value);

                            if (item != null)
                            {
                                var counter = await store.TryGetValueAsync(tx, item.Location);

                                var newCounter = counter.HasValue ?
                                                 new RunningTotal
                                {
                                    Count = counter.Value.Count,
                                    Day   = counter.Value.Day
                                }
                                    : new RunningTotal();
                                finalDayTotal = newCounter.Update(item.Time, item.Cost);
                                if (counter.HasValue)
                                {
                                    await store.TryUpdateAsync(tx, item.Location,
                                                               newCounter, counter.Value);
                                }
                                else
                                {
                                    await store.TryAddAsync(tx, item.Location, newCounter);
                                }
                            }
                            await tx.CommitAsync();

                            if (finalDayTotal != null)
                            {
                                await SendTotal(finalDayTotal, item.Location);
                            }
                        }
                    }
                }
                await Task.Delay(100, stoppingToken);

                queueEmpty = false;
            }
        }