public void DispatchesMessage() { var settings = new MessageDispatcherSettings(); settings.InputChannel.WithDefault(new InMemoryMessageChannel()); settings.InvalidChannel.WithDefault(new InMemoryMessageChannel()); settings.MessageProcessorTypes.WithDefault(new List<Type> { typeof(FakeMessageProcessor) }); settings.DurationOfDispatchingSlice.WithDefault(new TimeSpan(0, 0, 0, 0, 200)); settings.NumberOfMessagesToDispatchPerSlice.WithDefault(30); _dispatcher.Configure(settings); _dispatcher.Enable(); _transport.Open(); _transport.Send(GetRecord()); Assert.AreEqual(MessageDispatcherState.Enabled, _dispatcher.State); Thread.Sleep(5000); // wait for message to be processed Assert.IsTrue(FakeMessageProcessor.ProcessedAnyMessages); _dispatcher.Disable(); Assert.AreEqual(MessageDispatcherState.Disabled, _dispatcher.State); Assert.NotNull(_dispatcher); }
public void DispatchesMessages() { const int numberOfMessages = 1000; var settings = new MessageDispatcherSettings(); settings.InputChannel.WithDefault(new InMemoryMessageChannel()); settings.InvalidChannel.WithDefault(new InMemoryMessageChannel()); settings.MessageProcessorTypes.WithDefault(new List<Type> { typeof(FakeMessageProcessor) }); settings.DurationOfDispatchingSlice.WithDefault(new TimeSpan(0, 0, 0, 0, 200)); settings.NumberOfMessagesToDispatchPerSlice.WithDefault(30); _dispatcher.Configure(settings); _dispatcher.Enable(); Assert.AreEqual(MessageDispatcherState.Enabled, _dispatcher.State); _transport.Open(); var recordIds = new ConcurrentBag<Guid>(); var start = DateTime.Now; for (var j = 0; j < numberOfMessages; j++) { var record = GetRecord(); _transport.Send(record); recordIds.Add(record.Identifier); } Console.WriteLine("Sent 1000 messages in {0} ms", (DateTime.Now - start).TotalMilliseconds); Console.WriteLine("Waiting for messages to be processed"); start = DateTime.Now; Assert.AreEqual(numberOfMessages, recordIds.Count); var numberOfMessagesProcessed = 0; do { Thread.Sleep(200); numberOfMessagesProcessed = recordIds.Where(id => _registry.GetPublicationRecord(id).Completed).Count(); Console.WriteLine("{0} messages processed", numberOfMessagesProcessed); } while (numberOfMessagesProcessed < recordIds.Count()); Console.WriteLine("Completed in {0} seconds", (DateTime.Now - start).TotalSeconds); _dispatcher.Disable(); Assert.AreEqual(MessageDispatcherState.Disabled, _dispatcher.State); Assert.IsTrue(FakeMessageProcessor.ProcessedAnyMessages); }
public void ThrowsWithMissingMessageProcessors() { var container = new WindsorContainer(); var settings = new MessageDispatcherSettings(); settings.InvalidChannel.WithDefault(new InMemoryMessageChannel()); settings.InputChannel.WithDefault(new InMemoryMessageChannel()); _dispatcher.Configure(settings); }
public void ThrowsWithMissingInputTransport() { var container = new WindsorContainer(); var settings = new MessageDispatcherSettings(); _dispatcher.Configure(settings); }
public void MessagesThatArentPublicationRecordsAreInvalid() { var settings = new MessageDispatcherSettings(); settings.InputChannel.WithDefault(new InMemoryMessageChannel()); settings.InvalidChannel.WithDefault(new InMemoryMessageChannel()); settings.MessageProcessorTypes.WithDefault(new List<Type> { typeof(FakeMessageProcessor) }); settings.DurationOfDispatchingSlice.WithDefault(new TimeSpan(0, 0, 0, 0, 200)); settings.NumberOfMessagesToDispatchPerSlice.WithDefault(30); _dispatcher.Configure(settings); _dispatcher.Enable(); settings.InputChannel.Value.Open(); settings.InvalidChannel.Value.Open(); settings.InputChannel.Value.Send(new FakeMessage()); Thread.Sleep(750); var received = settings.InvalidChannel.Value.ReceiveSingle(TimeSpan.MaxValue); Assert.NotNull(received); Assert.AreEqual(typeof(FakeMessage), received.GetType()); _dispatcher.Disable(); settings.InvalidChannel.Value.Close(); settings.InputChannel.Value.Close(); }
public void ErrorsWhenChannelsArentConfigured() { var settings = new MessageDispatcherSettings(); Assert.Throws(typeof(NoInputChannelConfiguredException), () => _dispatcher.Configure(settings)); settings.InputChannel.WithDefault(new InMemoryMessageChannel()); Assert.Throws(typeof(NoInputChannelConfiguredException), () => _dispatcher.Configure(settings)); settings.InvalidChannel.WithDefault(new InMemoryMessageChannel()); Assert.Throws(typeof(NoMessageProcessorsConfiguredException), () => _dispatcher.Configure(settings)); settings.MessageProcessorTypes.WithDefault(new List<Type> { typeof(FakeMessageProcessor) }); _dispatcher.Configure(settings); }
public void EnablesWithoutError() { var container = new WindsorContainer(); var settings = new MessageDispatcherSettings(); settings.InputChannel.WithDefault(new InMemoryMessageChannel()); settings.InvalidChannel.WithDefault(new InMemoryMessageChannel()); settings.MessageProcessorTypes.WithDefault(new List<Type> { typeof(FakeMessageProcessor) }); settings.DurationOfDispatchingSlice.WithDefault(TimeSpan.Parse("00:00:30")); settings.NumberOfMessagesToDispatchPerSlice.WithDefault(30); _dispatcher.Configure(settings); _dispatcher.Enable(); Assert.AreEqual(MessageDispatcherState.Enabled, _dispatcher.State); }
public void DispatchesToMultipleProcessors() { var settings = new MessageDispatcherSettings(); settings.InputChannel.WithDefault(new InMemoryMessageChannel()); settings.InvalidChannel.WithDefault(new InMemoryMessageChannel()); settings.MessageProcessorTypes.WithDefault( new List<Type> { typeof(FakeMessageProcessor), typeof(FakeMessageProcessor2) }); settings.DurationOfDispatchingSlice.WithDefault(new TimeSpan(0, 0, 0, 0, 200)); settings.NumberOfMessagesToDispatchPerSlice.WithDefault(30); _dispatcher.Configure(settings); _dispatcher.Enable(); settings.InputChannel.Value.Open(); settings.InvalidChannel.Value.Open(); settings.InputChannel.Value.Send(GetRecord()); Thread.Sleep(750); Assert.IsTrue(FakeMessageProcessor.ProcessedAnyMessages); Thread.Sleep(750); Assert.IsTrue(FakeMessageProcessor2.ProcessedAnyMessages); _dispatcher.Disable(); settings.InvalidChannel.Value.Close(); settings.InputChannel.Value.Close(); }
private void extractProcessorsFromAgents() { var commandHost = new CommandHost(new ICommandDispatcher[] { }); foreach (var agent in Composite.Agents) { var processorAttribute = agent.AgentAssembly.GetAttributeValue<LocationOfProcessorsAttribute>(); // SELF the Where call below changes the meaning of the rest of the registration so it had to be removed Container.Register( AllTypes.FromAssembly(agent.AgentAssembly) // .Where(Component.IsInNamespace(processorAttribute.Namespace)) .BasedOn(typeof(ICommandProcessor)).Configure(c => c.LifeStyle.Transient).WithService.AllInterfaces().WithService. Self()); var registry = Container.Resolve<ICommandRegistry>(); var dispatcher = new CommandDispatcher(new WindsorServiceLocator(Container), registry); var dispatcherSettings = new MessageDispatcherSettings(); dispatcherSettings.InputChannel.WithDefault(CurrentSettings.InputChannel.Value); dispatcherSettings.InvalidChannel.WithDefault(CurrentSettings.ErrorChannel.Value); var processors = Container.ResolveAll(typeof(ICommandProcessor)); foreach (var processor in processors) { dispatcherSettings.MessageProcessorTypes.Add(processor.GetType()); } dispatcher.Configure(dispatcherSettings); commandHost.AddDispatcher(dispatcher); } Container.Register(Component.For<IHostedService>().Instance(commandHost).Forward<CommandHost>().LifeStyle.Transient); }