private async ValueTask <IMessage <T> > FetchSingleMessageFromBroker() { // Just being cautious if (IncomingMessages.Count > 0) { _log.Error("The incoming message queue should never be greater than 0 when Queue size is 0"); IncomingMessages.Empty(); } IMessage <T> message; try { // if cnx is null or if the connection breaks the connectionOpened function will send the flow again _waitingOnReceiveForZeroQueueSize = true; if (Connected()) { IncreaseAvailablePermits(_clientCnx); } do { message = await IncomingMessages.ReceiveAsync(); _lastDequeuedMessageId = message.MessageId; var msgCnx = ((Message <T>)message).Cnx(); // synchronized need to prevent race between connectionOpened and the check "msgCnx == cnx()" // if message received due to an old flow - discard it and wait for the message from the // latest flow command if (msgCnx == _clientCnx) { _waitingOnReceiveForZeroQueueSize = false; break; } } while(true); Stats.UpdateNumMsgsReceived(message); return(message); } catch (Exception e) { Stats.IncrementNumReceiveFailed(); throw PulsarClientException.Unwrap(e); } finally { // Finally blocked is invoked in case the block on incomingMessages is interrupted _waitingOnReceiveForZeroQueueSize = false; // Clearing the queue in case there was a race with messageReceived IncomingMessages.Empty(); } }
public Task <Message> ReceiveMessageAsync(CancellationToken cancellationToken) { return(IncomingMessages.ReceiveAsync(cancellationToken)); }