Ejemplo n.º 1
0
		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);
		}
Ejemplo n.º 2
0
		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);
		}
Ejemplo n.º 3
0
		public void ThrowsWithMissingMessageProcessors()
		{
			var container = new WindsorContainer();
			var settings = new MessageDispatcherSettings();

			settings.InvalidChannel.WithDefault(new InMemoryMessageChannel());
			settings.InputChannel.WithDefault(new InMemoryMessageChannel());

			_dispatcher.Configure(settings);
		}
Ejemplo n.º 4
0
		public void ThrowsWithMissingInputTransport()
		{
			var container = new WindsorContainer();
			var settings = new MessageDispatcherSettings();

			_dispatcher.Configure(settings);
		}
Ejemplo n.º 5
0
		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();
		}
Ejemplo n.º 6
0
		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);
		}
Ejemplo n.º 7
0
		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);
		}
Ejemplo n.º 8
0
		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();
		}
Ejemplo n.º 9
0
		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);
		}