Exemple #1
0
        public Task Attach()
        {
            Source source = CreateSource();
            Target target = CreateTarget();
            Attach frame  = new Attach
            {
                Source               = source,
                Target               = target,
                SndSettleMode        = SenderSettleMode.Unsettled,
                IncompleteUnsettled  = false,
                InitialDeliveryCount = 0
            };

            string linkName             = info.Id + ":" + target.Address;
            var    taskCompletionSource = new TaskCompletionSource <bool>();

            senderLink = new SenderLink(session.UnderlyingSession, linkName, frame, HandleOpened(taskCompletionSource));

            senderLink.AddClosedCallback((sender, error) =>
            {
                NMSException exception = ExceptionSupport.GetException(error, "Received Amqp link detach with Error for link {0}", info.Id);
                if (!taskCompletionSource.TrySetException(exception))
                {
                    session.RemoveProducer(info.Id);

                    // If session is not closed it means that the link was remotely detached
                    if (!senderLink.Session.IsClosed)
                    {
                        session.Connection.Provider.FireResourceClosed(info, exception);
                    }
                }
            });

            return(taskCompletionSource.Task);
        }
        public Task DestroyResource(ResourceInfo resourceInfo)
        {
            switch (resourceInfo)
            {
            case SessionInfo sessionInfo:
            {
                AmqpSession session = connection.GetSession(sessionInfo.Id);
                session.Close();
                return(Task.CompletedTask);
            }

            case ConsumerInfo consumerInfo:
            {
                AmqpSession  session  = connection.GetSession(consumerInfo.SessionId);
                AmqpConsumer consumer = session.GetConsumer(consumerInfo.Id);
                consumer.Close();
                session.RemoveConsumer(consumerInfo.Id);
                return(Task.CompletedTask);
            }

            case ProducerInfo producerInfo:
            {
                AmqpSession  session  = connection.GetSession(producerInfo.SessionId);
                AmqpProducer producer = session.GetProducer(producerInfo.Id);
                producer.Close();
                session.RemoveProducer(producerInfo.Id);
                return(Task.CompletedTask);
            }

            case NmsTemporaryDestination temporaryDestination:
            {
                AmqpTemporaryDestination amqpTemporaryDestination = connection.GetTemporaryDestination(temporaryDestination);
                if (amqpTemporaryDestination != null)
                {
                    amqpTemporaryDestination.Close();
                    connection.RemoveTemporaryDestination(temporaryDestination.Id);
                }
                else
                {
                    Tracer.Debug($"Could not find temporary destination {temporaryDestination.Id} to delete.");
                }

                return(Task.CompletedTask);
            }

            default:
                throw new ArgumentOutOfRangeException(nameof(resourceInfo), "Not supported resource type.");
            }
        }