Esempio n. 1
0
        /// <summary>
        /// Обрабатывает сообщение с помощью зарегистрированных фильтров.
        /// </summary>
        /// <param name="message">Обрабатываемое сообщение.</param>
        /// <returns>Задача обработки сообщения с помощью фильтров.</returns>
        private Task ProcessFilter(IMessage message)
        {
            var exchange = new MessageExchange(message, null);
            var invoker  = new MessageExchangeFilterInvoker(this.filters);

            return(invoker.Process(exchange));
        }
Esempio n. 2
0
            public void should_invoke_starting_with_recent()
            {
                var log      = new List <string>();
                var filters  = new[] { new LoggingFilter("A", log), new LoggingFilter("B", log), new LoggingFilter("C", log) };
                var exchange = new MessageExchange(new Message("msg".ToMessageLabel(), new object()));
                var invoker  = new MessageExchangeFilterInvoker(filters);

                invoker.Process(exchange).
                Wait(1.Seconds());

                log.Should().
                BeEquivalentTo(new object[] { "C: before", "B: before", "A: before", "A: after", "B: after", "C: after" });
            }
Esempio n. 3
0
        /// <summary>
        /// Sends message using request-reply pattern.
        /// <see cref="Headers.CorrelationId"/> header from <see cref="headers"/> parameter is used to correlate the request with the reply,
        /// new one is generated if none is supplied.
        /// </summary>
        /// <param name="payload">Message payload.</param>
        /// <param name="headers">Message headers.</param>
        /// <typeparam name="T">Type of response.</typeparam>
        /// <returns>Request processing task.</returns>
        public Task <T> Request <T>(object payload, IDictionary <string, object> headers) where T : class
        {
            var message = new Message(this.Configuration.Label, headers, payload);

            var exchange = new MessageExchange(message, typeof(T));
            var invoker  = new MessageExchangeFilterInvoker(this.filters);

            return(invoker.Process(exchange)
                   .ContinueWith(
                       t =>
            {
                t.Result.ThrowIfFailed();
                return (T)t.Result.In.Payload;
            }));
        }
Esempio n. 4
0
            /// <summary>
            /// The process.
            /// </summary>
            /// <param name="exchange">
            /// The exchange.
            /// </param>
            /// <param name="invoker">
            /// The invoker.
            /// </param>
            /// <returns>
            /// The <see cref="Task"/>.
            /// </returns>
            public Task <MessageExchange> Process(MessageExchange exchange, MessageExchangeFilterInvoker invoker)
            {
                this._log.Add(this._name + ": before");

                if (this._stop)
                {
                    return(Filter.Result(exchange));
                }

                return(invoker.Continue(exchange).
                       ContinueWith(
                           t =>
                {
                    this._log.Add(this._name + ": after");
                    return t.Result;
                }));
            }
        /// <summary>
        /// Если в кеше, есть ответное сообщение на входящее сообщение, тогда возвращает объект из кеша.
        /// </summary>
        /// <param name="exchange">Конвейер обработки сообщений.</param>
        /// <param name="invoker">Фильтры вызывающий конвейер.</param>
        /// <returns>Задача обработки сообщений.</returns>
        public Task <MessageExchange> Process(MessageExchange exchange, MessageExchangeFilterInvoker invoker)
        {
            if (!exchange.IsIncompleteRequest)
            {
                return(invoker.Continue(exchange));
            }

            string         hash   = this.hasher.CalculateHashOf(exchange.Out).ToString();
            Maybe <object> cached = this.cacheProvider.Find <object>(hash);

            if (cached.HasValue)
            {
                exchange.In = new Message(MessageLabel.Empty, cached.Value);
                return(Filter.Result(exchange));
            }

            return(invoker.Continue(exchange)
                   .ContinueWith(
                       t =>
            {
                MessageExchange resultExchange = t.Result;
                if (!resultExchange.IsCompleteRequest)
                {
                    return resultExchange;
                }

                string expiresHeader = Headers.GetString(resultExchange.In.Headers, Headers.Expires);
                if (!string.IsNullOrEmpty(expiresHeader))
                {
                    Expires expiration = Expires.Parse(expiresHeader);

                    if (expiration.Period.HasValue)
                    {
                        this.cacheProvider.Put(hash, resultExchange.In.Payload, expiration.Period.Value);
                    }
                    else
                    {
                        this.cacheProvider.Put(hash, resultExchange.In.Payload, expiration.Date.Value);
                    }
                }

                return resultExchange;
            }));
        }
Esempio n. 6
0
        /// <summary>
        /// Отправляет сообщение в формате запрос-ответ.
        /// </summary>
        /// <param name="label">Метка отправляемого запроса.</param>
        /// <param name="payload">Сообщение запроса.</param>
        /// <param name="headers">Заголовки запроса.</param>
        /// <typeparam name="T">Тип сообщения ответа.</typeparam>
        /// <returns>Задача выполнения запроса.</returns>
        public Task <T> Request <T>(MessageLabel label, object payload, IDictionary <string, object> headers) where T : class
        {
            if (!headers.ContainsKey(Headers.CorrelationId))
            {
                headers[Headers.CorrelationId] = Guid.NewGuid().ToString("n");
            }

            var message = new Message(this.Configuration.Label.Equals(MessageLabel.Any) ? label : this.Configuration.Label, headers, payload);

            var exchange = new MessageExchange(message, typeof(T));
            var invoker  = new MessageExchangeFilterInvoker(this.filters);

            return(invoker.Process(exchange)
                   .ContinueWith(
                       t =>
            {
                t.Result.ThrowIfFailed();
                return (T)t.Result.In.Payload;
            }));
        }
Esempio n. 7
0
        public Task <MessageExchange> Process(IMessageExchangeFilter filter, MessageExchange exchange, MessageExchangeFilterInvoker invoker)
        {
            if (!exchange.IsIncompleteRequest)
            {
                return(filter.Process(exchange, invoker));
            }

            var messageLabel = exchange.Out.Label.Name;

            CacheConfiguration config;

            if (!this.cacheConfiguration.TryGetValue(messageLabel, out config))
            {
                this.CollectMetrics(messageLabel, false);
                return(filter.Process(exchange, invoker));
            }

            if (!(config.Enabled ?? false))
            {
                this.CollectMetrics(messageLabel, false);
                return(filter.Process(exchange, invoker));
            }

            var cachedValue = config.Cache[exchange.Out];
            var cached      = cachedValue != null;

            this.CollectMetrics(messageLabel, cached);

            if (cached)
            {
                exchange.In = new Message(MessageLabel.Empty, cachedValue);
                return(Filter.Result(exchange));
            }

            return(filter.Process(exchange, invoker)
                   .ContinueWith(t => TryCacheResponse(t.Result, config)));
        }