private IMessageConsumer <MessageEx> CreateAndStartMainMessageConsumer(MsmqRouterFactory factory)
        {
            IMessageConsumer <MessageEx> consumer;
            IMessageSource <MessageEx>   messageSource = factory.CreateSource(InputQueue, false);

            switch (RoutableTransportMode)
            {
            case RoutableTransportMode.OnSite:
                consumer = factory.CreateConsumer(messageSource);
                break;

            case RoutableTransportMode.OnDemand:
                consumer = factory.CreateRouter(messageSource, factory, GetQueueNameToRouteMessageIn);
                break;

            default:
                throw new ApplicationException(string.Format("{0} plugin hosting mode is not supported", RoutableTransportMode.ToString()));
            }

            consumer.IsTransactional    = IsTransactional;
            consumer.IsolationLevel     = IsolationLevel;
            consumer.TransactionTimeout = TransactionTimeout;

            consumer.Consume(Handle);
            return(consumer);
        }
        private IMessageConsumer <MessageEx> CreateAndStartUiMessageConsumer(MsmqRouterFactory factory)
        {
            IMessageSource <MessageEx>   messageSource = factory.CreateSource(UiCommandInputQueue, false);
            IMessageConsumer <MessageEx> consumer      = factory.CreateConsumer(messageSource);

            switch (RoutableTransportMode)
            {
            case RoutableTransportMode.OnSite:
                consumer.Consume(Handle);
                break;

            case RoutableTransportMode.OnDemand:
                consumer.Consume(HandleAsync);
                break;
            }

            return(consumer);
        }
        /// <summary>
        /// Starts the transport.
        /// </summary>
        public void Start()
        {
            if (RoutableTransportMode == RoutableTransportMode.OnDemand)
            {
                int workersThreads;
                int ioThreads;
                ThreadPool.GetMaxThreads(out workersThreads, out ioThreads);
                ThreadPool.SetMaxThreads(100 * Environment.ProcessorCount, ioThreads);
                ThreadPool.SetMinThreads(50, 50);
            }

            CheckConfiguration();
            CreateQueuesIfNecessary();
            if (ErrorQueue != null)
            {
                _errorQueue = new MessageQueue(MsmqUtilities.GetFullPath(ErrorQueue));
            }
            if (!string.IsNullOrEmpty(InputQueue))
            {
                IPluginQueue inputQueue   = PluginQueueFactory.Create(InputQueue);
                IPluginQueue commandQueue = PluginQueueFactory.Create(UiCommandInputQueue);
                if (PurgeOnStartup)
                {
                    inputQueue.Purge();
                    commandQueue.Purge();
                }
                Logger.Info(LoggerContext.New(inputQueue.Name), "starting...");
                Logger.Info(LoggerContext.New(commandQueue.Name), "starting...");

                var factory = new MsmqRouterFactory(Logger, TimeSpan.FromSeconds(SecondsToWaitForMessage), GetTransactionTypeForSend, GetTransactionTypeForReceive());
                _inputQueueRouter = CreateAndStartMainMessageConsumer(factory);
                _uiQueueRouter    = CreateAndStartUiMessageConsumer(factory);
                Logger.Info(LoggerContext.New(inputQueue.Name), "started.");
                Logger.Info(LoggerContext.New(commandQueue.Name), "started.");
                _queue = inputQueue;
            }
        }
		private IMessageConsumer<MessageEx> CreateAndStartUiMessageConsumer(MsmqRouterFactory factory)
		{
			IMessageSource<MessageEx> messageSource = factory.CreateSource(UiCommandInputQueue, false);
			IMessageConsumer<MessageEx> consumer = factory.CreateConsumer(messageSource);
			switch (RoutableTransportMode)
			{
				case RoutableTransportMode.OnSite:
					consumer.Consume(Handle);
					break;
				case RoutableTransportMode.OnDemand:
					consumer.Consume(HandleAsync);
					break;
			}

			return consumer;
		}
		private IMessageConsumer<MessageEx> CreateAndStartMainMessageConsumer(MsmqRouterFactory factory)
		{
			IMessageConsumer<MessageEx> consumer;
			IMessageSource<MessageEx> messageSource = factory.CreateSource(InputQueue, false);
			switch (RoutableTransportMode)
			{
				case RoutableTransportMode.OnSite:
					consumer = factory.CreateConsumer(messageSource);
					break;
				case RoutableTransportMode.OnDemand:
					consumer = factory.CreateRouter(messageSource, factory, GetQueueNameToRouteMessageIn);
					break;
				default:
					throw new ApplicationException(string.Format("{0} plugin hosting mode is not supported", RoutableTransportMode.ToString()));
			}

			consumer.IsTransactional = IsTransactional;
			consumer.IsolationLevel = IsolationLevel;
			consumer.TransactionTimeout = TransactionTimeout;

			consumer.Consume(Handle);
			return consumer;
		}
		/// <summary>
		/// Starts the transport.
		/// </summary>
		public void Start()
		{
			if (RoutableTransportMode == RoutableTransportMode.OnDemand)
			{
				int workersThreads;
				int ioThreads;
				ThreadPool.GetMaxThreads(out workersThreads, out ioThreads);
				ThreadPool.SetMaxThreads(100 * Environment.ProcessorCount, ioThreads);
				ThreadPool.SetMinThreads(50, 50);
			}

			CheckConfiguration();
			CreateQueuesIfNecessary();
			if (ErrorQueue != null)
			{
				_errorQueue = new MessageQueue(MsmqUtilities.GetFullPath(ErrorQueue));
			}
			if (!string.IsNullOrEmpty(InputQueue))
			{
				IPluginQueue inputQueue = PluginQueueFactory.Create(InputQueue);
				IPluginQueue commandQueue = PluginQueueFactory.Create(UiCommandInputQueue);
				if (PurgeOnStartup)
				{
					inputQueue.Purge();
					commandQueue.Purge();
				}
				Logger.Info(LoggerContext.New(inputQueue.Name), "starting...");
				Logger.Info(LoggerContext.New(commandQueue.Name), "starting...");

				var factory = new MsmqRouterFactory(Logger, TimeSpan.FromSeconds(SecondsToWaitForMessage), GetTransactionTypeForSend,
					GetTransactionTypeForReceive());
				_inputQueueRouter = CreateAndStartMainMessageConsumer(factory);
				_uiQueueRouter = CreateAndStartUiMessageConsumer(factory);
				Logger.Info(LoggerContext.New(inputQueue.Name), "started.");
				Logger.Info(LoggerContext.New(commandQueue.Name), "started.");
				_queue = inputQueue;
			}
		}
        private IMessageConsumer<MessageEx> CreateAndStartMessageConsumer(IPluginQueue queue, Func<MessageEx, string> routeBy)
        {
            var factory = new MsmqRouterFactory(Logger, TimeSpan.FromSeconds(SecondsToWaitForMessage), GetTransactionTypeForSend, GetTransactionTypeForReceive());
            IMessageConsumer<MessageEx> consumer;
            IMessageSource<MessageEx> messageSource = factory.CreateSource(queue.Name);
            switch (RoutableTransportMode)
            {
                case RoutableTransportMode.OnSite:
                    consumer = factory.CreateConsumer(messageSource);
                    break;
                case RoutableTransportMode.OnDemand:
                    consumer = factory.CreateRouter(messageSource, factory, routeBy);
                    break;
                default:
                    throw new ApplicationException(string.Format("{0} plugin hosting mode is not supported", RoutableTransportMode.ToString()));
            }

            consumer.IsTransactional = IsTransactional;
            consumer.IsolationLevel = IsolationLevel;
            consumer.TransactionTimeout = TransactionTimeout;

            consumer.Consume(Handle);
            return consumer;
        }