예제 #1
0
        public Task <CommandResponseMessage> SendCommandAsync(CommandRequestMessage request, string queueName)
        {
            CheckDisposed();

            if (queueName == _replyQueueName)
            {
                _logger.LogWarning(
                    "The queuename {0} has the same same as the reply queue name, this should not happen",
                    _replyQueueName);
                throw new ArgumentException($"The queuename {queueName} is the same as the reply queue name");
            }

            var props = Channel.CreateBasicProperties();

            props.CorrelationId = Guid.NewGuid().ToString();
            props.ReplyTo       = _replyQueueName;
            props.Timestamp     = new AmqpTimestamp(DateTime.Now.Ticks);
            props.Type          = request.CommandType;
            var messageBytes = request.EncodeMessage();

            var tcs = new TaskCompletionSource <CommandResponseMessage>();

            _callbackMapper.TryAdd(props.CorrelationId, tcs);

            _logger.LogTrace("Sending command message with correlation id {id} and body {body} ", props.CorrelationId,
                             request);

            Channel.BasicPublish("",
                                 queueName,
                                 false,
                                 props,
                                 messageBytes);

            Channel.BasicConsume(_replyQueueName,
                                 true,
                                 "",
                                 false,
                                 false,
                                 null,
                                 _consumer);

            return(tcs.Task);
        }
        public Task<CommandResponseMessage> SendCommandAsync(CommandRequestMessage request, string queueName)
        {
            CheckDisposed();

            if (queueName == _replyQueueName)
            {
                _logger.LogWarning("The queuename {0} has the same same as the reply queue name, this should not happen", _replyQueueName);
                throw new ArgumentException($"The queuename {queueName} is the same as the reply queue name");
            }

            IBasicProperties props = Channel.CreateBasicProperties();
            props.CorrelationId = Guid.NewGuid().ToString();
            props.ReplyTo = _replyQueueName;
            props.Timestamp = new AmqpTimestamp(DateTime.Now.Ticks);
            var messageBytes = request.EncodeMessage();

            var tcs = new TaskCompletionSource<CommandResponseMessage>();
            _callbackMapper.TryAdd(props.CorrelationId, tcs);

            _logger.LogTrace("Sending command message with correlation id {id} and body {body} ", props.CorrelationId, request);

            Channel.BasicPublish(exchange: "",
                                 routingKey: queueName,
                                 mandatory: false,
                                 basicProperties: props,
                                 body: messageBytes);

            Channel.BasicConsume(queue: _replyQueueName,
                                 autoAck: true,
                                 consumerTag: "",
                                 noLocal: false,
                                 exclusive: false,
                                 arguments: null,
                                 consumer: _consumer);

            return tcs.Task;
        }