/// <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> /// Отправляет сообщение в формате запрос-ответ. /// </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; })); }