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); }
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(); }
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(); }
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"); }
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); } }
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(); }
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(); }
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); }
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); }
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); }
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); }
public static async Task Run([QueueTrigger("ordersaga")] string orderSagaMessage, TraceWriter log) { log.Info($"OrderSagaEndpointFunction message received: {orderSagaMessage}"); await container.HandleAsync(orderSagaMessage, log); }
public static async Task Run([QueueTrigger("paymentservice")] string myQueueItem, ILogger log) { log.LogInformation($"PaymentServiceCommandReceiverFunction received a message: {myQueueItem}"); await container.HandleAsync(myQueueItem, log); }
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); }