/// <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())); }
/// <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>())); }
/// <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())); }
/// <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(); }
/// <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)); }
/// <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); }
/// <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."); } }
/// <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)); }
/// <summary> /// Создает копию сообщения с указанной меткой. /// </summary> /// <param name="label"> /// Новая метка сообщения. /// </param> /// <returns> /// Новое сообщение. /// </returns> public IMessage WithLabel(MessageLabel label) { return(new Message(label, Headers, Payload)); }
/// <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) { }
/// <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)))); }
/// <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))); }
/// <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)); }
/// <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)); }
/// <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); }
/// <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; }
/// <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)); }