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