static void SendAutoDistributeDemo() { // demonstrate distributing messages evenly across queues // each call to Send chooses the next queue to send the message to IBus bus = new BusBuilder() .WithLogging(new FileLogger()) .InstallMsmqIfNeeded() .DefineErrorQueue("MiniBus.errors") .DefineWriteQueue("MiniBus.messages1") .DefineWriteQueue("MiniBus.messages2") .DefineWriteQueue("MiniBus.messages3") .CreateLocalQueuesAutomatically() .AutoDistributeOnSend() .JsonSerialization() .CreateBus(); var p = new Person { Name = "Bob", Age = 20 }; bus.Send(p); // MiniBus.messages1 bus.Send(p); // MiniBus.messages2 bus.Send(p); // MiniBus.messages3 bus.Send(p); // MiniBus.messages1 Console.WriteLine("\nPress a key to exit"); Console.ReadLine(); bus.Dispose(); }
static void SendDemo() { // demonstrate sending message to defined write queue IBus bus = new BusBuilder() .WithLogging(new FileLogger()) .InstallMsmqIfNeeded() .DefineErrorQueue("MiniBus.errors") .DefineWriteQueue("MiniBus.messages1") .CreateLocalQueuesAutomatically() .EnlistInAmbientTransactions() .JsonSerialization() .CreateBus(); // transaction scope isn't required unless modifying another transactional resource at the same time using (var scope = new TransactionScope()) { for (int i = 1; i <= 10; i++) { var p = new Person { Name = "Bob", Age = i }; // insert/update a database to see atomic commit bus.Send(p); } scope.Complete(); } Console.WriteLine("\nPress a key to exit"); Console.ReadLine(); bus.Dispose(); }
static void ReceiveDemo() { // demonstrate receiving - Receive processes whatever messages happen to be on the queue at the time of the call Console.WriteLine("\nPress a key to read message/s"); Console.ReadLine(); IBus bus = new BusBuilder() .WithLogging(new FileLogger()) .InstallMsmqIfNeeded() .DefineErrorQueue("MiniBus.errors") .DefineReadQueue("MiniBus.messages1") .CreateLocalQueuesAutomatically() .EnlistInAmbientTransactions() .JsonSerialization() .NumberOfRetries(3) .CreateBus(); // pass true to have a message fail and moved to the error queue bus.RegisterHandler(new PersonHandler(false)); bus.Receive <Person>(); Console.WriteLine("\nPress a key to exit"); Console.ReadLine(); bus.Dispose(); }
static void ReturnErrorMessagesDemo() { // demonstrate moving messages from error queue to read queue IBus bus = new BusBuilder() .WithLogging(new FileLogger()) .DefineErrorQueue("MiniBus.errors") .DefineReadQueue("MiniBus.messages1") .CreateLocalQueuesAutomatically() .CreateBus(); bus.ReturnErrorMessages(); Console.WriteLine("\nPress a key to exit"); Console.ReadLine(); bus.Dispose(); }
static void ReceiveDemoAsync() { // demonstrate receiving asynchrnously - ReceiveAsync processes messages as and when they arrive. // Open another instance to send messages while the other receives. IBus bus = new BusBuilder() .WithLogging(new ConsoleLogger()) .InstallMsmqIfNeeded() .DefineErrorQueue("MiniBus.errors") .DefineReadQueue("MiniBus.messages1") .CreateLocalQueuesAutomatically() .EnlistInAmbientTransactions() .JsonSerialization() .NumberOfRetries(3) .CreateBus(); bus.RegisterHandler(new PersonHandler(false)); bus.ReceiveAsync <Person>(); Console.WriteLine("\nPress a key to exit"); Console.ReadLine(); bus.Dispose(); }
public async Task TheStartupTimeShouldBeAcceptable() { const int numMessageTypes = 50; var assemblyBuilder = EmitMessageContractsAndHandlersAssembly(numMessageTypes); var logger = TestHarnessLoggerFactory.Create(Guid.NewGuid(), GetType().FullName); var typeProvider = new AssemblyScanningTypeProvider(assemblyBuilder); var firstBus = new BusBuilder().Configure() .WithNames("MyTestSuite", Environment.MachineName) .WithDefaults(typeProvider) .WithTransport(new WindowsServiceBusTransportConfiguration() .WithConnectionString(DefaultSettingsReader.Get <AzureServiceBusConnectionString>())) .WithLogger(logger) .WithDebugOptions( dc => dc.RemoveAllExistingNamespaceElementsOnStartup( "I understand this will delete EVERYTHING in my namespace. I promise to only use this for test suites.")) .Build(); try { try { await firstBus.Start(MessagePumpTypes.All); } catch (AggregateException exc) { throw exc.Flatten(); } } finally { firstBus.Dispose(); } var subsequentBus = new BusBuilder().Configure() .WithNames("MyTestSuite", Environment.MachineName) .WithTransport(new WindowsServiceBusTransportConfiguration() .WithConnectionString(DefaultSettingsReader.Get <AzureServiceBusConnectionString>())) .WithDefaults(typeProvider) .WithLogger(logger) .Build(); try { try { await subsequentBus.Start(MessagePumpTypes.All); } catch (AggregateException exc) { throw exc.Flatten(); } } finally { subsequentBus.Dispose(); } }
public async Task TheStartupTimeShouldBeAcceptable() { const int numMessageTypes = 100; var assemblyBuilder = EmitMessageContractsAndHandlersAssembly(numMessageTypes); var logger = TestHarnessLoggerFactory.Create(); var typeProvider = new AssemblyScanningTypeProvider(new[] { assemblyBuilder }); var firstBus = new BusBuilder().Configure() .WithNames("MyTestSuite", Environment.MachineName) .WithConnectionString(CommonResources.ServiceBusConnectionString) .WithTypesFrom(typeProvider) .WithDefaultTimeout(TimeSpan.FromSeconds(10)) .WithServerConnectionCount(100) .WithLogger(logger) .Build(); try { using (new AssertingStopwatch("First bus startup", TimeSpan.FromMinutes(1))) { { try { await firstBus.Start(MessagePumpTypes.All); WriteBlankLines(); } catch (AggregateException exc) { throw exc.Flatten(); } } } } finally { WriteBlankLines(); firstBus.Dispose(); } WriteBlankLines(); var subsequentBus = new BusBuilder().Configure() .WithNames("MyTestSuite", Environment.MachineName) .WithConnectionString(CommonResources.ServiceBusConnectionString) .WithTypesFrom(typeProvider) .WithDefaultTimeout(TimeSpan.FromSeconds(10)) .WithLogger(logger) .Build(); try { using (new AssertingStopwatch("Subsequent bus startup", TimeSpan.FromSeconds(20))) { try { await subsequentBus.Start(MessagePumpTypes.All); WriteBlankLines(); } catch (AggregateException exc) { throw exc.Flatten(); } } } finally { WriteBlankLines(); subsequentBus.Dispose(); } }