public void SendRequest <TRequest, TReply>(IList <string> endPoints, TRequest message, Action <IList <TReply> > callback, Dictionary <string, string> headers = null) where TRequest : Message where TReply : Message { var messageId = Guid.NewGuid(); IRequestConfiguration configuration = Configuration.GetRequestConfiguration(messageId); configuration.EndpointsCount = endPoints.Count; var responses = new List <TReply>(); configuration.SetHandler(r => { responses.Add((TReply)r); if (configuration.EndpointsCount == configuration.ProcessedCount) { callback(responses); } }); lock (_requestLock) { _requestConfigurations[messageId.ToString()] = configuration; } if (headers == null) { headers = new Dictionary <string, string>(); } headers["RequestMessageId"] = messageId.ToString(); var messageString = JsonConvert.SerializeObject(message); var messageBytes = Encoding.UTF8.GetBytes(messageString); if (Configuration.OutgoingFilters != null && Configuration.OutgoingFilters.Count > 0) { var envelope = new Envelope { Headers = headers.ToDictionary(x => x.Key, x => (object)x.Value), Body = messageBytes }; var stop = ProcessFilters(Configuration.OutgoingFilters, envelope); if (stop) { return; } headers = envelope.Headers.ToDictionary(x => x.Key, x => x.Value.ToString()); messageBytes = envelope.Body; } foreach (string endPoint in endPoints) { _producer.Send(endPoint, typeof(TRequest), messageBytes, headers); } }
public IList <TReply> SendRequest <TRequest, TReply>(IList <string> endPoints, TRequest message, Dictionary <string, string> headers, int timeout) where TRequest : Message where TReply : Message { var messageId = Guid.NewGuid(); IRequestConfiguration configuration = Configuration.GetRequestConfiguration(messageId); var responses = new List <TReply>(); configuration.EndpointsCount = endPoints.Count; Task task = configuration.SetHandler(r => responses.Add((TReply)r)); lock (_busState.RequestLock) { _busState.RequestConfigurations[messageId.ToString()] = configuration; } if (headers == null) { headers = new Dictionary <string, string>(); } headers["RequestMessageId"] = messageId.ToString(); var messageString = JsonConvert.SerializeObject(message); var messageBytes = Encoding.UTF8.GetBytes(messageString); if (Configuration.OutgoingFilters != null && Configuration.OutgoingFilters.Count > 0) { var envelope = new Envelope { Headers = headers.ToDictionary(x => x.Key, x => (object)x.Value), Body = messageBytes }; var stop = ProcessFilters(Configuration.OutgoingFilters, envelope); if (stop) { return(responses); } headers = envelope.Headers.ToDictionary(x => x.Key, x => x.Value.ToString()); messageBytes = envelope.Body; } foreach (var endPoint in endPoints) { _sendMessagePipeline.ExecuteSendMessagePipeline(typeof(TRequest), messageBytes, headers, endPoint); } Task.WaitAll(new[] { task }, timeout); return(responses); }
public void SendRequest <TRequest, TReply>(string endPoint, TRequest message, Action <TReply> callback, Dictionary <string, string> headers) where TRequest : Message where TReply : Message { var messageId = Guid.NewGuid(); IRequestConfiguration configuration = Configuration.GetRequestConfiguration(messageId); configuration.EndpointsCount = 1; configuration.SetHandler(r => callback((TReply)r)); lock (_busState.RequestLock) { _busState.RequestConfigurations[messageId.ToString()] = configuration; } if (headers == null) { headers = new Dictionary <string, string>(); } headers["RequestMessageId"] = messageId.ToString(); var messageString = JsonConvert.SerializeObject(message); var messageBytes = Encoding.UTF8.GetBytes(messageString); if (Configuration.OutgoingFilters != null && Configuration.OutgoingFilters.Count > 0) { var envelope = new Envelope { Headers = headers.ToDictionary(x => x.Key, x => (object)x.Value), Body = messageBytes }; var stop = ProcessFilters(Configuration.OutgoingFilters, envelope); if (stop) { return; } headers = envelope.Headers.ToDictionary(x => x.Key, x => x.Value.ToString()); messageBytes = envelope.Body; } if (string.IsNullOrEmpty(endPoint)) { _sendMessagePipeline.ExecuteSendMessagePipeline(typeof(TRequest), messageBytes, headers); } else { _sendMessagePipeline.ExecuteSendMessagePipeline(typeof(TRequest), messageBytes, headers, endPoint); } }
public IList <TReply> PublishRequest <TRequest, TReply>(TRequest message, int?expectedCount, Dictionary <string, string> headers, int timeout) where TRequest : Message { var messageId = Guid.NewGuid(); IRequestConfiguration configuration = Configuration.GetRequestConfiguration(messageId); var responses = new List <TReply>(); configuration.EndpointsCount = expectedCount ?? -1; Task task = configuration.SetHandler(r => responses.Add((TReply)r)); lock (_requestLock) { _requestConfigurations[messageId.ToString()] = configuration; } if (headers == null) { headers = new Dictionary <string, string>(); } headers["RequestMessageId"] = messageId.ToString(); var messageString = JsonConvert.SerializeObject(message); var messageBytes = Encoding.UTF8.GetBytes(messageString); if (Configuration.OutgoingFilters != null && Configuration.OutgoingFilters.Count > 0) { var envelope = new Envelope { Headers = headers == null ? new Dictionary <string, object>() : headers.ToDictionary(x => x.Key, x => (object)x.Value), Body = messageBytes }; var stop = ProcessFilters(Configuration.OutgoingFilters, envelope); if (stop) { return(responses); } headers = envelope.Headers.ToDictionary(x => x.Key, x => x.Value.ToString()); messageBytes = envelope.Body; } _producer.Publish(typeof(TRequest), messageBytes, headers); Task.WaitAll(new[] { task }, timeout); return(responses); }
public TReply SendRequest <TRequest, TReply>(string endPoint, TRequest message, Dictionary <string, string> headers, int timeout) where TRequest : Message where TReply : Message { var messageId = Guid.NewGuid(); IRequestConfiguration configuration = Configuration.GetRequestConfiguration(messageId); configuration.EndpointsCount = 1; TReply response = default(TReply); Task task = configuration.SetHandler(r => { response = (TReply)r; }); lock (_requestLock) { _requestConfigurations[messageId.ToString()] = configuration; } if (headers == null) { headers = new Dictionary <string, string>(); } headers["RequestMessageId"] = messageId.ToString(); var messageString = JsonConvert.SerializeObject(message); var messageBytes = Encoding.UTF8.GetBytes(messageString); if (Configuration.OutgoingFilters != null && Configuration.OutgoingFilters.Count > 0) { var envelope = new Envelope { Headers = headers.ToDictionary(x => x.Key, x => (object)x.Value), Body = messageBytes }; var stop = ProcessFilters(Configuration.OutgoingFilters, envelope); if (stop) { return(response); } headers = envelope.Headers.ToDictionary(x => x.Key, x => x.Value.ToString()); messageBytes = envelope.Body; } if (string.IsNullOrEmpty(endPoint)) { _producer.Send(typeof(TRequest), messageBytes, headers); } else { _producer.Send(endPoint, typeof(TRequest), messageBytes, headers); } Task.WaitAll(new[] { task }, timeout); if (!task.IsCompleted) { throw new TimeoutException(); } return(response); }