示例#1
0
        /// <summary>
        /// Асинхронно посылает сообщение в формате запрос-ответ.
        /// Для отправки необходимо указать метку сообщения, на основе которой строится маршрут сообщения.
        /// </summary>
        /// <param name="label">Метка посылаемого сообщения.</param>
        /// <param name="payload">Тело запроса.</param>
        /// <param name="headers">Заголовки запроса.</param>
        /// <typeparam name="TResponse">Тип ответа.</typeparam>
        /// <returns>Задача отправки сообщения.</returns>
        protected Task <TResponse> InternalRequest <TResponse>(MessageLabel label, object payload, IDictionary <string, object> headers) where TResponse : class
        {
            this.EnsureIsReady();

            return(this.GetSenderFor(label)
                   .Request <TResponse>(label, payload, headers ?? new Dictionary <string, object>()));
        }
示例#2
0
        /// <summary>
        /// Асинхронно посылает сообщение.
        /// Для отправки необходимо указать метку сообщения, на основе которой строится маршрут сообщения.
        /// </summary>
        /// <param name="label">Метка посылаемого сообщения.</param>
        /// <param name="payload">Тело сообщения.</param>
        /// <param name="options">Параметры отправки сообщения.</param>
        /// <returns>Задача отправки сообщения.</returns>
        protected Task InternalSend(MessageLabel label, object payload, PublishingOptions options)
        {
            this.EnsureIsReady();

            return(this.GetSenderFor(label)
                   .Send(label, payload, options ?? new PublishingOptions()));
        }
示例#3
0
        /// <summary>Выполняет синхронный запрос данных с указанной меткой.</summary>
        /// <typeparam name="TRequest">Тип данных запроса.</typeparam>
        /// <typeparam name="TResponse">Тип ожидаемого ответа.</typeparam>
        /// <param name="label">Метка отправляемого запроса.</param>
        /// <param name="request">Отправляемое сообщение.</param>
        /// <param name="headers">Заголовки запроса.</param>
        /// <param name="responseAction">Действие которое нужно выполнить при получении ответного сообщения.</param>
        public void Request <TRequest, TResponse>(MessageLabel label, TRequest request, IDictionary <string, object> headers, Action <TResponse> responseAction) where TRequest : class where TResponse : class
        {
            EnsureCanSendUsing(label);

            this.InternalRequest <TResponse>(label, request, headers)
            .ContinueWith(
                t =>
            {
                if (t.IsFaulted)
                {
                    if (t.Exception != null)
                    {
                        throw t.Exception;
                    }

                    throw new Exception();
                }

                if (t.IsCanceled)
                {
                    throw new OperationCanceledException();
                }

                responseAction(t.Result);
            })
            .Wait();
        }
示例#4
0
        /// <summary>
        /// Асинхронно посылает сообщение в формате запрос-ответ.
        /// Для отправки необходимо указать метку сообщения, на основе которой строится маршрут сообщения.
        /// </summary>
        /// <param name="label">Метка посылаемого сообщения.</param>
        /// <param name="payload">Тело запроса.</param>
        /// <param name="options">Параметры отправки запроса.</param>
        /// <typeparam name="TResponse">Тип ответа.</typeparam>
        /// <returns>Задача отправки сообщения.</returns>
        protected Task <TResponse> InternalRequest <TResponse>(MessageLabel label, object payload, RequestOptions options) where TResponse : class
        {
            this.EnsureIsReady();

            return(this.GetSenderFor(label)
                   .Request <TResponse>(label, payload, options ?? new RequestOptions()));
        }
示例#5
0
        /// <summary>
        /// Посылает сообщение.
        /// Для отправки необходимо указать метку сообщения, на основе которой строится маршрут сообщения.
        /// </summary>
        /// <param name="label">Метка посылаемого сообщения.</param>
        /// <param name="payload">Тело сообщения.</param>
        /// <param name="headers">Заголовки сообщения.</param>
        /// <returns>Задача отправки сообщения.</returns>
        public Task Emit(MessageLabel label, object payload, IDictionary <string, object> headers)
        {
            this.EnsureIsReady();

            return(this
                   .GetSenderFor(label)
                   .Send(label, payload, headers));
        }
示例#6
0
        /// <summary>
        /// Вычисляет отправителя для указанной метки сообщений.
        /// </summary>
        /// <param name="label">Метка отправляемого сообщения.</param>
        /// <returns>Отправитель сообщения с указанной меткой.</returns>
        /// <exception cref="BusConfigurationException">Генерируется исключение, если нет отправителя для указанной метки.</exception>
        protected ISender GetSenderFor(MessageLabel label)
        {
            ISender sender = this.Senders.FirstOrDefault(s => s.CanRoute(label)) ?? this.Senders.FirstOrDefault(s => s.CanRoute(MessageLabel.Any));

            if (sender == null)
            {
                throw new BusConfigurationException("No sender is configured to send [{0}].".FormatEx(label));
            }

            return(sender);
        }
示例#7
0
        /// <summary>
        /// Проверяет возможность отправить сообщение с указанной меткой.
        /// </summary>
        /// <param name="label">Метка отправляемого сообщения.</param>
        /// <exception cref="InvalidOperationException">Генерируется если нельзя отправлять указанные метки сообщения.</exception>
        // ReSharper disable UnusedParameter.Local
        private static void EnsureCanSendUsing(MessageLabel label)
        // ReSharper restore UnusedParameter.Local
        {
            if (label.IsAny)
            {
                throw new InvalidOperationException("Can't send using Any label.");
            }

            if (label.IsEmpty)
            {
                throw new InvalidOperationException("Can't send using Empty label.");
            }
        }
示例#8
0
 /// <summary>
 /// Инициализирует новый экземпляр класса <see cref="Message"/>.
 /// </summary>
 /// <param name="label">
 /// The label.
 /// </param>
 /// <param name="headers">
 /// The headers.
 /// </param>
 /// <param name="payload">
 /// The payload.
 /// </param>
 public Message(MessageLabel label, IDictionary <string, object> headers, object payload)
 {
     this.Label   = label;
     this.Headers = headers;
     this.Payload = payload;
 }
示例#9
0
 /// <summary>
 /// The equals.
 /// </summary>
 /// <param name="other">
 /// The other.
 /// </param>
 /// <returns>
 /// The <see cref="bool"/>.
 /// </returns>
 private bool Equals(MessageLabel other)
 {
     return(string.Equals(this.Name, other.Name));
 }
示例#10
0
 /// <summary>
 /// Проверяет возможность обрабатывать сообщения с указанной меткой.
 /// </summary>
 /// <param name="label">Метка сообщения.</param>
 /// <returns><c>true</c> - если шина сообщения умеет обрабатывать указанную метку сообщений.</returns>
 public bool CanHandle(MessageLabel label)
 {
     return(this.configuration.ReceiverConfigurations.Any(cc => cc.Label.Equals(label)));
 }
示例#11
0
        /// <summary>Выполняет асинхронный запрос данных с указанной меткой.</summary>
        /// <typeparam name="TRequest">Тип данных запроса.</typeparam>
        /// <typeparam name="TResponse">Тип ожидаемого ответа</typeparam>
        /// <param name="label">Метка отправляемого сообщения.</param>
        /// <param name="request">Отправляемое сообщение.</param>
        /// <param name="headers">Заголовки запроса.</param>
        /// <returns>Задача получения ответного сообщения.</returns>
        public Task <TResponse> RequestAsync <TRequest, TResponse>(MessageLabel label, TRequest request, IDictionary <string, object> headers) where TRequest : class where TResponse : class
        {
            EnsureCanSendUsing(label);

            return(this.InternalRequest <TResponse>(label, request, headers));
        }
示例#12
0
        /// <summary>
        /// Асинхронно посылает сообщение в формате запрос-ответ.
        /// Для отправки необходимо указать метку сообщения, на основе которой строится маршрут сообщения.
        /// </summary>
        /// <param name="label">Метка посылаемого сообщения.</param>
        /// <param name="request">Тело запроса.</param>
        /// <param name="options">Параметры отправки запроса.</param>
        /// <typeparam name="TRequest">Тип запроса.</typeparam>
        /// <typeparam name="TResponse">Тип ответа.</typeparam>
        /// <returns>Задача отправки сообщения.</returns>
        public Task <TResponse> RequestAsync <TRequest, TResponse>(MessageLabel label, TRequest request, RequestOptions options = null) where TResponse : class where TRequest : class
        {
            EnsureCanSendUsing(label);

            return(this.InternalRequest <TResponse>(label, request, options));
        }
示例#13
0
 /// <summary>
 /// Посылает сообщение в формате запрос-ответ.
 /// Для отправки необходимо указать метку сообщения, на основе которой строится маршрут сообщения.
 /// </summary>
 /// <param name="label">Метка посылаемого сообщения.</param>
 /// <param name="request">Тело запроса.</param>
 /// <param name="responseAction">Действие вызываемое при получении ответа.</param>
 /// <typeparam name="TRequest">Тип запроса.</typeparam>
 /// <typeparam name="TResponse">Тип ответа.</typeparam>
 public void Request <TRequest, TResponse>(MessageLabel label, TRequest request, Action <TResponse> responseAction) where TRequest : class where TResponse : class
 {
     Request(label, request, (RequestOptions)null, responseAction);
 }
示例#14
0
        /// <summary>
        /// Посылает сообщение.
        /// Для отправки необходимо указать метку сообщения, на основе которой строится маршрут сообщения.
        /// </summary>
        /// <param name="label">Метка посылаемого сообщения.</param>
        /// <param name="payload">Тело сообщения.</param>
        /// <param name="options">Параметры отправки сообщения.</param>
        /// <typeparam name="T">Тип отправляемого сообщения.</typeparam>
        /// <returns>Задача отправки сообщения.</returns>
        public Task Emit <T>(MessageLabel label, T payload, PublishingOptions options = null) where T : class
        {
            EnsureCanSendUsing(label);

            return(this.InternalSend(label, payload, options));
        }
示例#15
0
 /// <summary>
 /// Проверяет возможность построить маршрут для сообщения с указанной меткой.
 /// </summary>
 /// <param name="label">Метка сообщения.</param>
 /// <returns><c>true</c> - если шина сообщения умеет строить маршрут для указанной метки сообщений.</returns>
 public bool CanRoute(MessageLabel label)
 {
     return(this.configuration.SenderConfigurations.Any(pc => pc.Label.Equals(label) || (pc.Alias != null && pc.Alias.Equals(label.Name))));
 }
示例#16
0
 /// <summary>
 /// Инициализирует новый экземпляр класса <see cref="Message"/>.
 /// </summary>
 /// <param name="label">
 /// The label.
 /// </param>
 /// <param name="payload">
 /// The payload.
 /// </param>
 public Message(MessageLabel label, object payload)
     : this(label, new Dictionary <string, object>(), payload)
 {
 }
示例#17
0
 /// <summary>
 /// Создает копию сообщения с указанной меткой.
 /// </summary>
 /// <param name="label">
 /// Новая метка сообщения.
 /// </param>
 /// <returns>
 /// Новое сообщение.
 /// </returns>
 public IMessage WithLabel(MessageLabel label)
 {
     return(new Message(label, Headers, Payload));
 }
示例#18
0
 /// <summary>
 /// The equals.
 /// </summary>
 /// <param name="other">
 /// The other.
 /// </param>
 /// <returns>
 /// The <see cref="bool"/>.
 /// </returns>
 private bool Equals(MessageLabel other)
 {
     return string.Equals(this.Name, other.Name);
 }