/// <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)); }
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" }); }
/// <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; })); }
/// <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; })); }
/// <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; })); }
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))); }