Beispiel #1
0
        public void Sagas_With_Locks_Can_Be_Singletons()
        {
            var sagaId = Guid.NewGuid();

            var container = new HandlersContainer(SERVICENAME, true);

            Assert.IsTrue(container.messageToSagaDictionary[typeof(SingletonSagaStartingMessage)].Count == 1);

            container.HandleAsync(new SingletonSagaStartingMessage()
            {
                Id = sagaId
            }, null).Wait();

            container.HandleAsync(new SingletonSagaStartingMessage()
            {
                Id = sagaId
            }, null).Wait();

            var lockSaga        = false;
            var sagaPersistence = new SagaAzureStoragePersistence(new SagaAzureStorageLocker(), lockSaga);

            var sagaData = sagaPersistence.GetSagaDataAsync <SingletonTestSagaData>("SingletonTestSaga", sagaId.ToString()).Result as SingletonTestSagaData;

            Assert.IsTrue(sagaData.Counter == 1);
        }
Beispiel #2
0
        public void Sagas_With_Locks_Are_Correctly_Started_And_10_Non_Parallel_Messages_Are_Correlated()
        {
            var sagaId = Guid.NewGuid();

            var container = new HandlersContainer(SERVICENAME, true);

            Assert.IsTrue(container.messageToSagaDictionary[typeof(SimpleSagaStartingMessage)].Count == 1);

            container.HandleAsync(new SimpleSagaStartingMessage()
            {
                Id = sagaId
            }, null).Wait();

            for (int i = 0; i < 10; i++)
            {
                container.HandleAsync(new SimpleSagaIntermediateMessage()
                {
                    Id = sagaId
                }, null).Wait();
            }

            var lockSaga        = false;
            var sagaPersistence = new SagaAzureStoragePersistence(new SagaAzureStorageLocker(), lockSaga);

            var sagaData = sagaPersistence.GetSagaDataAsync <SimpleTestSagaData>("SimpleTestSaga", sagaId.ToString()).Result as SimpleTestSagaData;

            Assert.IsTrue(sagaData.Counter == 11);

            container.HandleAsync(new SimpleSagaTerminatingMessage()
            {
                Id = sagaId
            }, null).Wait();
        }
Beispiel #3
0
        public void Sagas_With_Locks_Lock_is_freed_in_exception()
        {
            var sagaId = Guid.NewGuid();

            var container = new HandlersContainer(SERVICENAME, true);

            Assert.IsTrue(container.messageToSagaDictionary[typeof(ErrorSagaStartingMessage)].Count == 1);

            container.HandleAsync(new ErrorSagaStartingMessage()
            {
                Id = sagaId
            }, null).Wait();

            try
            {
                container.HandleAsync(new ErrorSagaIntermediateMessage()
                {
                    Id = sagaId
                }, null).Wait();
            }
            catch
            { }

            var locker = new SagaAzureStorageLocker();

            var lease = locker.CreateLock(ErrorTestSaga.PARTITION_KEY + sagaId.ToString()).Result;

            locker.DeleteLock(ErrorTestSaga.PARTITION_KEY + sagaId.ToString(), lease).Wait();

            container.HandleAsync(new ErrorSagaTerminatingMessage()
            {
                Id = sagaId
            }, null).Wait();
        }
Beispiel #4
0
        public void Sagas_With_Events_Multiple_Saga_Can_Receive_An_Event()
        {
            InvocationCounter.Instance.Reset();

            var sagaId1 = Guid.NewGuid();
            var sagaId2 = Guid.NewGuid();

            var container = new HandlersContainer(SERVICENAME, true);

            Assert.IsTrue(container.messageToSagaDictionary[typeof(EventSagaStartingMessage)].Count == 1);

            container.HandleAsync(new EventSagaStartingMessage()
            {
                Id = sagaId1
            }, null).Wait();
            container.HandleAsync(new EventSagaStartingMessage()
            {
                Id = sagaId2
            }, null).Wait();

            container.HandleAsync(new EventSagaIntermediateMessage()
            {
            }, null).Wait();

            Assert.IsTrue(InvocationCounter.Instance.Counter == 2);

            container.HandleAsync(new EventSagaTerminatingMessage()
            {
                Id = sagaId1
            }, null).Wait();
            container.HandleAsync(new EventSagaTerminatingMessage()
            {
                Id = sagaId2
            }, null).Wait();
        }
        public void HandlersContainer_IHandle2HandlersInOneClass()
        {
            InvocationCounter.Instance.Reset();
            var container = new HandlersContainer(SERVICENAME);

            container.HandleAsync(new ClassWithTwoHandlersMessage1(), null).Wait();
            container.HandleAsync(new ClassWithTwoHandlersMessage2(), null).Wait();

            Assert.IsTrue(InvocationCounter.Instance.Counter == 2);
        }
        public void HandlersContainer_HandleAsync_Sends_To_Delay_If_Some_Delay_Is_Left_2()
        {
            InvocationCounter.Instance.Reset();

            var container = new HandlersContainer();

            HandlersContainer.AddDependencyWithInstance <ISendMessages>(new AzureStorageQueueSendTransportShortMaxDelay(HandlersContainer.SolveDependency <ISerializeMessages>()));


            var message = new TestMessage()
            {
                SomeData = "delayed"
            };

            var serializer = HandlersContainer.SolveDependency <ISerializeMessages>();


            SendOnlyBus.SendAsync(message, SERVICENAME, TimeSpan.FromSeconds(15), serializer, new AzureStorageQueueSendTransportShortMaxDelay(serializer)).Wait();

            string stringMessage = null;

            do
            {
                stringMessage = QueueReader.ReadOneMessageFromQueueAsync(SERVICENAME).Result;
            }while (string.IsNullOrEmpty(stringMessage));

            container.HandleAsync(stringMessage, null).Wait();

            Assert.IsTrue(InvocationCounter.Instance.Counter == 0, "message not delayed");


            do
            {
                stringMessage = QueueReader.ReadOneMessageFromQueueAsync(SERVICENAME).Result;
            }while (string.IsNullOrEmpty(stringMessage));

            container.HandleAsync(stringMessage, null).Wait();

            Assert.IsTrue(InvocationCounter.Instance.Counter == 0, "message not delayed 2");

            do
            {
                stringMessage = QueueReader.ReadOneMessageFromQueueAsync(SERVICENAME).Result;
            }while (string.IsNullOrEmpty(stringMessage));

            container.HandleAsync(stringMessage, null).Wait();


            Assert.IsTrue(InvocationCounter.Instance.Counter == 2, "message delayed more than once");
        }
Beispiel #7
0
        private async Task ExecuteAsync(CancellationToken cancellationToken)
        {
            CloudStorageAccount storageAccount = CloudStorageAccount.Parse(SettingsUtil.GetSettings <string>(SETTINGS.AZURE_STORAGE));

            CloudQueueClient queueClient = storageAccount.CreateCloudQueueClient();

            CloudQueue queue = queueClient.GetQueueReference(UI_SERVICE_NAME.ToLower());
            await queue.CreateIfNotExistsAsync();


            while (!cancellationToken.IsCancellationRequested)
            {
                // Get the next message
                CloudQueueMessage retrievedMessage = await queue.GetMessageAsync();

                if (retrievedMessage != null)
                {
                    await handlerContainer.HandleAsync(retrievedMessage.AsString, null);

                    //Process the message in less than 30 seconds, and then delete the message
                    await queue.DeleteMessageAsync(retrievedMessage);
                }

                await Task.Delay(TimeSpan.FromSeconds(10), cancellationToken);
            }
        }
Beispiel #8
0
        public void Sagas_With_Locks_Are_Correctly_Started_And_10_Parallel_Messages_Are_Correlated()
        {
            InvocationCounter.Instance.Reset();
            var sagaId = Guid.NewGuid();

            var container = new HandlersContainer(SERVICENAME, true);

            Assert.IsTrue(container.messageToSagaDictionary[typeof(SimpleSagaStartingMessage)].Count == 1);

            container.HandleAsync(new SimpleSagaStartingMessage()
            {
                Id = sagaId
            }, null).Wait();

            Parallel.For(0, 10, i =>
            {
                bool retry = true;
                while (retry)
                {
                    try
                    {
                        container.HandleAsync(new SimpleSagaIntermediateMessage()
                        {
                            Id = sagaId
                        }, null).Wait();
                        retry = false;
                    }
                    catch (Exception)
                    {
                    }
                }
            });

            var lockSaga        = false;
            var sagaPersistence = new SagaAzureStoragePersistence(new SagaAzureStorageLocker(), lockSaga);

            var sagaData = sagaPersistence.GetSagaDataAsync <SimpleTestSagaData>("SimpleTestSaga", sagaId.ToString()).Result as SimpleTestSagaData;

            Assert.IsTrue(sagaData.Counter == 11);

            Assert.IsTrue(InvocationCounter.Instance.Counter == 11);

            container.HandleAsync(new SimpleSagaTerminatingMessage()
            {
                Id = sagaId
            }, null).Wait();
        }
        public void HandlersContainer_HandlerNotFoundForThisMessage()
        {
            var container = new HandlersContainer();

            Assert.IsTrue(container.messageHandlersDictionary[typeof(TestMessage)].Count == 2);

            container.HandleAsync(new TestMessageHandler2(), null).Wait();
        }
Beispiel #10
0
        public void DI_Nominal()
        {
            var container = new HandlersContainer();

            HandlersContainer.AddDependency <IUoWTest, UoWTest>();

            Assert.IsTrue(container.messageHandlersDictionary[typeof(DIMessage)].Count == 1);

            container.HandleAsync(new DIMessage(), null).Wait();
        }
Beispiel #11
0
        public void Sagas_With_Locks_Are_Correctly_Started_And_A_Message_Is_Not_Correlated()
        {
            var sagaId = Guid.NewGuid();

            var container = new HandlersContainer(SERVICENAME, true);

            Assert.IsTrue(container.messageToSagaDictionary[typeof(SimpleSagaStartingMessage)].Count == 1);

            container.HandleAsync(new SimpleSagaStartingMessage()
            {
                Id = sagaId
            }, null).Wait();

            //non correlating message
            container.HandleAsync(new SimpleSagaIntermediateMessage()
            {
                Id = Guid.NewGuid()
            }, null).Wait();
        }
        public void HandlersContainer_IHandleTypesAreCorrectlyInvoked()
        {
            InvocationCounter.Instance.Reset();

            var container = new HandlersContainer();

            Assert.IsTrue(container.messageHandlersDictionary[typeof(TestMessage)].Count == 2);

            container.HandleAsync(new TestMessage(), null).Wait();

            Assert.IsTrue(InvocationCounter.Instance.Counter == 2);
        }
Beispiel #13
0
        public void DI_Dependency_not_found()
        {
            var container = new HandlersContainer();

            HandlersContainer.ClearDependencies();

            Assert.IsTrue(container.messageHandlersDictionary[typeof(DIMessage)].Count == 1);


            try
            {
                container.HandleAsync(new DIMessage(), null).Wait();
            }
            catch (Exception ex)
            {
                Assert.IsTrue(ex.InnerException.Message.Contains("No depedency can be solved"));
                throw ex;
            }
        }
        public void Performance_StatelessHandler()
        {
            var messages = Enumerable.Range(0, NUMBER_OF_MESSAGES).Select(i => new TestMessage()
            {
                SomeData = i.ToString()
            });

            var before = DateTime.Now;

            Parallel.ForEach(messages, m =>
            {
                container.HandleAsync(m, null).Wait();
            });

            var after = DateTime.Now;

            var difference = after - before;

            Assert.IsTrue(difference.TotalMilliseconds < 10000);
        }
Beispiel #15
0
        public void BigMessage_Bug_Small_After_Big_Mixes_Message_In_File_Flag()
        {
            BlobReader.DeleteFilesAsync().Wait();
            QueueReader.CleanQueueAsync(SERVICENAME).Wait();

            InvocationCounter.Instance.Reset();

            var container = new HandlersContainer(SERVICENAME);

            var message = new BigMessage2();

            message.Data = new string('*', 66000);

            SendOnlyBus.SendAsync(message, SERVICENAME).Wait();

            var stringMessage = QueueReader.ReadOneMessageFromQueueAsync(SERVICENAME).Result;

            container.HandleAsync(stringMessage, null).Wait();

            Assert.IsTrue(BlobReader.ListFilesAsync().Result.Count() == 0);
        }
Beispiel #16
0
        public void BigMessage_Going_To_File_In_Send()
        {
            BlobReader.DeleteFilesAsync().Wait();
            QueueReader.CleanQueueAsync(SERVICENAME).Wait();

            InvocationCounter.Instance.Reset();

            var container = new HandlersContainer(SERVICENAME);

            var message = new BigMessage();

            message.Data = new string('*', 66000);

            SendOnlyBus.SendAsync(message, SERVICENAME).Wait();

            var stringMessage = QueueReader.ReadOneMessageFromQueueAsync(SERVICENAME).Result;

            container.HandleAsync(stringMessage, null).Wait();

            Assert.IsTrue(InvocationCounter.Instance.Counter == 1);
        }
Beispiel #17
0
        public static async Task Run([QueueTrigger("ordersaga")] string orderSagaMessage, TraceWriter log)
        {
            log.Info($"OrderSagaEndpointFunction message received: {orderSagaMessage}");

            await container.HandleAsync(orderSagaMessage, log);
        }
Beispiel #18
0
        public static async Task Run([QueueTrigger("paymentservice")] string myQueueItem, ILogger log)
        {
            log.LogInformation($"PaymentServiceCommandReceiverFunction received a message: {myQueueItem}");

            await container.HandleAsync(myQueueItem, log);
        }
Beispiel #19
0
        public static async Task Run([QueueTrigger("shippingservice")] string myQueueItem, TraceWriter log)
        {
            log.Info($"C# Queue trigger function processed: {myQueueItem}");

            await container.HandleAsync(myQueueItem, log);
        }
        public static async Task Run([QueueTrigger(SERVICENAME)] string orderSagaMessage, ILogger log)
        {
            log.LogInformation($"OrderSagaEndpointFunction message received: {orderSagaMessage}");

            await container.HandleAsync(orderSagaMessage, log);
        }