public Task PublishAsync <TMessage>(TMessage message, Guid globalMessageId, PublishConfiguration config) { var context = _contextProvider.GetMessageContext(globalMessageId); var props = _propertiesProvider.GetProperties <TMessage>(config.PropertyModifier + (p => p.Headers.Add(PropertyHeaders.Context, context))); Task exchangeTask; lock (_topologyLock) { exchangeTask = _topologyProvider.DeclareExchangeAsync(config.Exchange); } var channelTask = _channelFactory.GetChannelAsync(); return(Task .WhenAll(exchangeTask, channelTask) .ContinueWith(t => { lock (_publishLock) { var ackTask = _acknowledger.GetAckTask(channelTask.Result); channelTask.Result.BasicPublish( exchange: config.Exchange.ExchangeName, routingKey: _config.RouteWithGlobalId ? $"{config.RoutingKey}.{globalMessageId}" : config.RoutingKey, basicProperties: props, body: _serializer.Serialize(message) ); return ackTask; } }) .Unwrap()); }
private Task <TResponse> SendRequestAsync <TRequest, TResponse>(TRequest message, Guid globalMessageId, RequestConfiguration cfg, IRawConsumer consumer) { var correlationId = Guid.NewGuid().ToString(); var responseSource = new ResponseCompletionSource { RequestTimer = new Timer(state => { ResponseCompletionSource rcs; if (!_responseDictionary.TryRemove(correlationId, out rcs)) { _logger.LogWarning($"Unable to find request timer for {correlationId}."); return; } rcs.RequestTimer?.Dispose(); rcs.TrySetException( new TimeoutException($"The request '{correlationId}' timed out after {_config.RequestTimeout.ToString("g")}.")); }, null, _config.RequestTimeout, new TimeSpan(-1)) }; _responseDictionary.TryAdd(correlationId, responseSource); consumer.Model.BasicPublish( exchange: cfg.Exchange.ExchangeName, routingKey: _config.RouteWithGlobalId ? $"{cfg.RoutingKey}.{globalMessageId}" : cfg.RoutingKey, basicProperties: _propertiesProvider.GetProperties <TResponse>(p => { p.ReplyTo = cfg.ReplyQueue.QueueName; p.CorrelationId = correlationId; p.Expiration = _config.RequestTimeout.TotalMilliseconds.ToString(); p.Headers.Add(PropertyHeaders.Context, _contextProvider.GetMessageContext(globalMessageId)); }), body: _serializer.Serialize(message) ); return(responseSource.Task.ContinueWith(tResponse => { if (tResponse.IsFaulted) { throw tResponse.Exception?.InnerException ?? new Exception("Failed to recieve response"); } return (TResponse)tResponse.Result; })); }