public void AfterMessageIsConsumed(MessageDispatch dispatch, bool expired)
{
if(this.unconsumedMessages.Closed)
{
return;
}
if(expired)
{
lock(this.dispatchedMessages)
{
this.dispatchedMessages.Remove(dispatch);
}
AckLater(dispatch, AckType.DeliveredAck);
}
else
{
if(this.session.IsTransacted)
{
// Do nothing.
}
else if(this.IsAutoAcknowledgeEach)
{
if(this.deliveringAcks.CompareAndSet(false, true))
{
lock(this.dispatchedMessages)
{
if(this.dispatchedMessages.Count != 0)
{
MessageAck ack = MakeAckForAllDeliveredMessages(AckType.ConsumedAck);
if(ack != null)
{
this.dispatchedMessages.Clear();
this.session.SendAck(ack);
}
}
}
this.deliveringAcks.Value = false;
}
}
else if(this.IsAutoAcknowledgeBatch)
{
AckLater(dispatch, AckType.ConsumedAck);
}
else if(IsClientAcknowledge || IsIndividualAcknowledge)
{
bool messageAckedByConsumer = false;
lock(this.dispatchedMessages)
{
messageAckedByConsumer = this.dispatchedMessages.Contains(dispatch);
}
if(messageAckedByConsumer)
{
AckLater(dispatch, AckType.DeliveredAck);
}
}
else
{
throw new NMSException("Invalid session state.");
}
}
}