Exemple #1
0
            public void OnReceiveDisposition(Disposition disposition)
            {
                SequenceNumber first = disposition.First.Value;
                SequenceNumber last  = disposition.Last ?? first;

                this.session.diagnostics.SetLastDisposition(last.Value);
                bool settled = disposition.Settled();

                for (SequenceNumber i = first; ; i.Increment())
                {
                    Delivery delivery = this.GetDelivery(i);
                    if (delivery != null && delivery.Link != null)
                    {
                        delivery.Settled = settled;
                        delivery.State   = disposition.State;
                        delivery.Link.OnDisposeDelivery(delivery);
                    }

                    if (i == last)
                    {
                        break;
                    }
                }

                if (settled)
                {
                    this.Settle();
                }
            }
Exemple #2
0
 protected AmqpObject(string type)
 {
     this.identifier          = SequenceNumber.Increment(ref AmqpObject.nextId);
     this.name                = string.Concat(type, this.identifier);
     this.DefaultOpenTimeout  = TimeSpan.FromSeconds(60);
     this.DefaultCloseTimeout = TimeSpan.FromSeconds(60);
 }
Exemple #3
0
            void DisposeAndSettle()
            {
                if (this.session.State != AmqpObjectState.Opened)
                {
                    return;
                }

                bool           needSettle = false;
                SequenceNumber start;
                SequenceNumber end;

                lock (this.syncRoot)
                {
                    start = this.unsettledLwm;
                    end   = this.nextDeliveryId;
                }

                Disposition disposition = null;

                for (; start != end; start.Increment())
                {
                    Delivery firstDelivery = this.GetDelivery(start);
                    if (firstDelivery == null || !firstDelivery.StateChanged)
                    {
                        continue;
                    }

                    firstDelivery.StateChanged = false;
                    if (firstDelivery.Settled)
                    {
                        needSettle = true;
                    }

                    disposition         = new Disposition();
                    disposition.First   = start.Value;
                    disposition.Settled = firstDelivery.Settled;
                    disposition.State   = firstDelivery.State;
                    disposition.Role    = this.IsReceiver;

                    SequenceNumber last  = start;
                    int            count = 0;
                    for (last.Increment(); last != end; last.Increment())
                    {
                        Delivery lastDelivery = this.GetDelivery(last);
                        if (lastDelivery == null)
                        {
                            ++count;
                            continue;
                        }

                        if (!lastDelivery.StateChanged ||
                            lastDelivery.Settled != firstDelivery.Settled ||
                            !IsEqual(lastDelivery.State as Outcome, firstDelivery.State as Outcome))
                        {
                            break;
                        }

                        lastDelivery.StateChanged = false;
                        ++count;
                    }

                    if (count > 0)
                    {
                        disposition.Last = start + count;
                        start            = disposition.Last.Value;
                    }

                    this.session.SendCommand(disposition);
                }

                if (needSettle)
                {
                    this.Settle();
                }
            }