Пример #1
0
 public SagaJsonMapper(string connectionString, string sagaTypeName)
 {
     cloudTable = SagaIndexer.GetTable(connectionString, sagaTypeName);
 }
Пример #2
0
        public void When_duplicates_found_Should_raise_an_event_for_every_duplicate_set_found(int testSize)
        {
            const int NumberOfCollisionsForEach = 2;
            var modulo = testSize / NumberOfCollisionsForEach;

            var toCreate = Enumerable.Range(0, testSize).Select(i => Tuple.Create(i, Guid.NewGuid())).ToArray();

            const int concurrency = 100;
            var semaphore = new SemaphoreSlim(concurrency);

            foreach (var t in toCreate)
            {
                semaphore.Wait();
                cloudTable.ExecuteAsync(TableOperation.Insert(CreateSagaState(t, modulo)))
                    .ContinueWith(task =>
                    {
                        if (task.Exception != null)
                        {
                            Console.WriteLine($"Exception occured {task.Exception}");
                        }
                        semaphore.Release();
                    });
            }

            for (var i = 0; i < concurrency; i++)
            {
                semaphore.Wait();
            }

            var comparer = EqualityComparers.GetValueComparer(EdmType.Int64);
            var indexer = new SagaIndexer(cloudTable, "CorrelatingId", o => (ulong)(long)o, comparer);
            var results = new List<Tuple<Guid, Guid[]>>();

            indexer.SearchForDuplicates((o, guids) => results.Add(Tuple.Create(o, guids.ToArray())));

            var dict = results
                .GroupBy(t => t.Item1, t => t.Item2, comparer)
                .ToDictionary(g => g.Key, g => g.SelectMany(ids => ids).Distinct().ToArray(), comparer);

            Assert.AreEqual(modulo, dict.Count);
            foreach (var kvp in dict)
            {
                Assert.AreEqual(2, kvp.Value.Length);
            }
        }