void OnReceiveMessage(AmqpMessage message) { if (this.messageListener != null) { this.messageListener(message); } else { ReceiveAsyncResult waiter = null; int creditToIssue = 0; bool releaseMessage = false; lock (this.SyncRoot) { if (this.waiterList != null && this.waiterList.Count > 0) { waiter = this.waiterList.First.Value; this.waiterList.RemoveFirst(); waiter.OnRemoved(); creditToIssue = this.Settings.AutoSendFlow ? 0 : this.GetOnDemandReceiveCredit(); } else if (!this.Settings.AutoSendFlow && this.Settings.SettleType != SettleMode.SettleOnSend) { releaseMessage = true; } else if (this.messageQueue != null) { this.messageQueue.Enqueue(message); AmqpTrace.Provider.AmqpCacheMessage( this, message.DeliveryId.Value, this.messageQueue.Count, this.messageQueue.IsPrefetchingBySize, this.TotalCacheSizeInBytes ?? 0, this.Settings == null ? 0 : this.Settings.TotalLinkCredit, this.LinkCredit); } } if (releaseMessage) { this.ReleaseMessage(message); message.Dispose(); } if (creditToIssue > 0) { this.IssueCredit((uint)creditToIssue, false, AmqpConstants.NullBinary); } if (waiter != null) { // Schedule the completion on another thread so we don't block the I/O thread ActionItem.Schedule( o => { var state = (Tuple <ReceiveAsyncResult, IEnumerable <AmqpMessage> >)o; state.Item1.Signal(state.Item2, false); }, new Tuple <ReceiveAsyncResult, IEnumerable <AmqpMessage> >(waiter, new AmqpMessage[] { message })); } } }
protected override void AbortInternal() { Queue <AmqpMessage> messages = null; this.CancelPendingOperations(true, out messages); if (messages != null) { foreach (AmqpMessage message in messages) { message.Dispose(); } } AmqpMessage temp = this.currentMessage; if (temp != null) { temp.Dispose(); } base.AbortInternal(); }
protected override bool CloseInternal() { Queue <AmqpMessage> messages = null; this.CancelPendingOperations(false, out messages); if (messages != null) { foreach (AmqpMessage message in messages) { this.ReleaseMessage(message); message.Dispose(); } } AmqpMessage temp = this.currentMessage; if (temp != null) { temp.Dispose(); } return(base.CloseInternal()); }
void OnReceiveMessage(AmqpMessage message) { if (this.messageListener != null) { this.messageListener(message); } else { ReceiveAsyncResult waiter = null; int creditToIssue = 0; bool releaseMessage = false; lock (this.SyncRoot) { if (this.waiterList != null && this.waiterList.Count > 0) { var firstWaiter = this.waiterList.First.Value; if (this.messageQueue.IsPrefetchingBySize) { if (this.messageQueue.UpdateCreditToIssue(message)) { this.SetTotalLinkCredit(this.messageQueue.BoundedTotalLinkCredit, true); } } firstWaiter.Add(message); if (firstWaiter.RequestedMessageCount == 1 || firstWaiter.MessageCount >= firstWaiter.RequestedMessageCount) { this.waiterList.RemoveFirst(); firstWaiter.OnRemoved(); creditToIssue = this.Settings.AutoSendFlow ? 0 : this.GetOnDemandReceiveCredit(); waiter = firstWaiter; } } else if (!this.Settings.AutoSendFlow && this.Settings.SettleType != SettleMode.SettleOnSend) { releaseMessage = true; } else if (this.messageQueue != null) { this.messageQueue.Enqueue(message); AmqpTrace.Provider.AmqpCacheMessage( this, message.DeliveryId.Value, this.messageQueue.Count, this.messageQueue.IsPrefetchingBySize, this.TotalCacheSizeInBytes ?? 0, this.Settings == null ? 0 : this.Settings.TotalLinkCredit, this.LinkCredit); } } if (releaseMessage) { this.ReleaseMessage(message); message.Dispose(); } if (creditToIssue > 0) { this.IssueCredit((uint)creditToIssue, false, AmqpConstants.NullBinary); } if (waiter != null) { // Schedule the completion on another thread so we don't block the I/O thread ActionItem.Schedule(o => { var w = (ReceiveAsyncResult)o; w.Signal(false); }, waiter); } } }