示例#1
0
        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());
        }
示例#2
0
        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;
            }));
        }