public RabbitMQTaskQueueRequestChannel(BindingContext context, ChannelManagerBase channelManager, EndpointAddress remoteAddress, Uri via, BufferManager bufferManger, RabbitMQTaskQueueBinding binding)
     : base(context, channelManager, binding, new EndpointAddress(RabbitMQTaskQueueUri.Create(remoteAddress.Uri.Host, remoteAddress.Uri.Port, $"r{Guid.NewGuid():N}")))
 {
     MethodInvocationTrace.Write();
     RemoteAddress = remoteAddress;
     _bufferMgr = bufferManger;
     _requestFunc = Request;
     Via = via;
     RemoteUri = new RabbitMQTaskQueueUri(remoteAddress.Uri.ToString());
 }
 protected RabbitMQTaskQueueDuplexChannelBase(BindingContext context, ChannelManagerBase channelManager, RabbitMQTaskQueueBinding binding, EndpointAddress remoteAddress, EndpointAddress localAddress)
     : base(context, channelManager, binding, localAddress)
 {
     MethodInvocationTrace.Write();
     _tryReceiveMethod = TryReceive;
     _receiveFunc = Receive;
     _waitForMsgFunc = WaitForMessage;
     _sendFunc = Send;
     _remoteAddress = remoteAddress;
     _closeOutputSessionFunc = CloseOutputSession;
     _remoteUri = (remoteAddress.Uri == EndpointAddress.AnonymousUri) ? null : new RabbitMQTaskQueueUri(remoteAddress.Uri.ToString());
 }
        protected override void OnOpen(TimeSpan timeout)
        {
            MethodInvocationTrace.Write();
            var timeoutTimer = TimeoutTimer.StartNew(timeout);
            base.OnOpen(timeoutTimer.RemainingTime);

            var connFactory = Binding.CreateConnectionFactory(RemoteAddress.Uri.Host, RemoteAddress.Uri.Port);
            var localAddress = new RabbitMQTaskQueueUri(LocalAddress.Uri.ToString());
            var setup = new RabbitMQReaderSetup
            {
                CancelToken = ConcurrentOperationManager.Token,
                ConnectionFactory = connFactory,
                DeleteQueueOnClose = true,
                Exchange = Binding.Exchange,
                IsDurable = Binding.IsDurable,
                MaxPriority = Binding.MaxPriority,
                Options = Binding.ReaderOptions,
                QueueName = localAddress.QueueName,
                QueueTimeToLive = Binding.ReplyQueueTimeToLive,
                Timeout = timeoutTimer.RemainingTime,
            };
            setup.QueueArguments = new Dictionary<string, object>();
            setup.QueueArguments.Add(TaskQueueReaderQueueArguments.IsTaskInputQueue, false);
            setup.QueueArguments.Add(TaskQueueReaderQueueArguments.Scheme, Constants.Scheme);
            _queueReader = Binding.QueueReaderWriterFactory.CreateReader(setup);
        }
 public override void Reply(Message message, TimeSpan timeout)
 {
     MethodInvocationTrace.Write();
     var timeoutTimer = TimeoutTimer.StartNew(timeout);
     using (_opMgr.TrackOperation())
     {
         if (_binding.MessageConfirmationMode == MessageConfirmationModes.BeforeReply)
         {
             _queueReader.AcknowledgeMessage(_deliveryTag, TimeSpan.MaxValue, CancellationToken.None);
         }
         if (message == null)
         {
             _replySent = true;
             return;
         }
         var remoteAddress = new RabbitMQTaskQueueUri(RequestMessage.Headers.ReplyTo.Uri.ToString());
         message.Headers.From = _replyToAddress;
         message.Headers.ReplyTo = _replyToAddress;
         message.Headers.MessageId = new UniqueId();
         _queueWriter.Enqueue(_binding.Exchange, remoteAddress.QueueName, message, _bufferMgr, _binding, _msgEncoderFactory, TimeSpan.MaxValue, timeoutTimer.RemainingTime, _opMgr.Token);
         _replySent = true;
     }
 }